目前來看,要在物件上實現可迭代功能,最簡單的方式就是使用生成器函式。
使用示例:使用生成器函式,實現乙個迭代器能夠以深度優先的模式遍歷樹的節點
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直接退出,不繼續執行...