可能重複:
Difference between Python Generators vs Iterators與迭代器相比,生成器的好處是什麼?
發電機看起來大不了在Python中,新的功能現在,然後等添加到他們。
據我所見,代替發電機,你總是可以使用帶有迭代器接口的對象。 (通常)更簡潔是發電機的唯一好處還是我錯過了什麼?
可能重複:
Difference between Python Generators vs Iterators與迭代器相比,生成器的好處是什麼?
發電機看起來大不了在Python中,新的功能現在,然後等添加到他們。
據我所見,代替發電機,你總是可以使用帶有迭代器接口的對象。 (通常)更簡潔是發電機的唯一好處還是我錯過了什麼?
是的,迭代器是一個更一般的結構,任何你可以用一個生成器做的事情都可以用迭代器完成。
但是,生成器是非常好的工具,以非常簡潔的方式表達某些想法,迭代器會變得繁瑣。
例如,這裏有一個簡單的函數:
def count_to(m):
n = 0
while n <= m:
yield n
n += 1
尼斯和容易。以下是同樣的事情一個迭代:
class CountTo:
def __init__(self, m):
self.m = m
self.n = 0
def __iter__(self):
return self
def next(self):
if self.n <= self.m:
cur, self.n = self.n, self.n + 1
return cur
else:
raise StopIteration()
一個是5行,另一種是12的發電機表示迭代過程非常succintly,而迭代器與顯式地維護狀態和樣板代碼混淆它。
很多Python的哲學是基於可讀性和簡單性的。爲了保持這一點,我覺得發生器爲廣泛的任務提供了一個更好的界面,否則這些任務會需要迭代器。是的,迭代器更強大,但發生器的語法優勢當然不容忽視。
謝謝!我同意第一個版本在視覺和語義上看起來更清晰,但是權衡是你需要引入/學習一種新的語言結構。我只是擔心,也許我忽略了別的東西。 – Aivar
你能否詳細說明一個具有迭代器接口的對象如何與生成器不同? –
@Vaughn,謝謝,請參閱http://stackoverflow.com/questions/2776829/difference-between-python-generators-vs-iterators –
。我沒有意識到缺少語法糖,並且暴露了除next()之外的方法的自定義迭代器*,它們不同於生成器:) –