使用生成器 實現迭代協議

2021-09-02 01:46:29 字數 1249 閱讀 9801

目前來看,要在物件上實現可迭代功能,最簡單的方式就是使用生成器函式。

使用示例:使用生成器函式,實現乙個迭代器能夠以深度優先的模式遍歷樹的節點

class node:

def __init__(self, value):

self._value = value

self._children =

def __repr__(self):

return 'node()'.format(self._value)

def add_children(self, node):

def __iter__(self):

return iter(self._children)

def depth_first(self):

"""1、首先產生出自身

2、然後迭代每個子節點,利用子節點的depth_first()方法(通過yield from 語句)產生出其他元素

"""yield self

for c in self:

yield from c.depth_first()

root = node(0)

child1 = node(1)

child2 = node(2)

root.add_children(child1)

root.add_children(child2)

child1.add_children(node(3))

child1.add_children(node(4))

child2.add_children(node(5))

for ch in root.depth_first():

print(ch) # 深度優先

outs:

node(0)

node(1)

node(3)

node(4)

node(2)

node(5)

關於node類:

1、node類本身就是乙個迭代器,以委託迭代的方式實現;

2、類裡面的depth_first()方法,使用生成器函式實現了以深度優先的模式遍歷樹節點的迭代器。

總結:1、python的迭代協議要求__iter__()返回乙個特殊的迭代器物件,該物件必須實現__next__()方法,並使用stopiteration異常來通知迭代完成;

2、把迭代器以生成器的形式來定義,以此實現迭代協議非常高效。

python使用生成器實現可迭代物件

案例分析 實乙個可迭代物件的類,它能迭代出給定範圍內所有的素數 nbjhzcgehhlsp pn number 1,30 for k in pn print k 結果為 2,3,5,7,11,13,17,19,23,29 如何解決這個問題?將該類的 iter 方法實現成生成器函式,每次yield返回...

生成器 迭代器

最近見天一直在看廖大的python教程,卻發現很多基礎看著很簡單,但卻不會應用,歸根結底還是因為理解不到位,故而又將教程學了一遍,並將自己的理解記錄一下,也方便後面查閱。由於沒有相關程式設計基礎,有些理解可能是錯的,敬請批評指正。想深入具體學習廖大部落格請移步廖雪峰的官方 有時候用迴圈生成列表太過繁...

迭代器,生成器

迭代器 生成器 生成器的第1種實現方式 列表生成式改為生成器 python中yield關鍵字 函式中如果有yield,那麼呼叫這個函式的返回值為生成器。當生成器g呼叫next方法,執行函式,知道遇到yield就停止 再執行next,從上一次停止的地方繼續執行 函式中遇return直接退出,不繼續執行...