2012-10-07 42 views
0

可能重複:
Difference between Python Generators vs Iterators與迭代器相比,生成器的好處是什麼?

發電機看起來大不了在Python中,新的功能現在,然後等添加到他們。

據我所見,代替發電機,你總是可以使用帶有迭代器接口的對象。 (通常)更簡潔是發電機的唯一好處還是我錯過了什麼?

+0

你能否詳細說明一個具有迭代器接口的對象如何與生成器不同? –

+3

@Vaughn,謝謝,請參閱http://stackoverflow.com/questions/2776829/difference-between-python-generators-vs-iterators –

+0

。我沒有意識到缺少語法糖,並且暴露了除next()之外的方法的自定義迭代器*,它們不同於生成器:) –

回答

8

是的,迭代器是一個更一般的結構,任何你可以用一個生成器做的事情都可以用迭代器完成。

但是,生成器是非常好的工具,以非常簡潔的方式表達某些想法,迭代器會變得繁瑣。

例如,這裏有一個簡單的函數:

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的哲學是基於可讀性和簡單性的。爲了保持這一點,我覺得發生器爲廣泛的任務提供了一個更好的界面,否則這些任務會需要迭代器。是的,迭代器更強大,但發生器的語法優勢當然不容忽視。

+0

謝謝!我同意第一個版本在視覺和語義上看起來更清晰,但是權衡是你需要引入/學習一種新的語言結構。我只是擔心,也許我忽略了別的東西。 – Aivar

-1

迭代器和生成器之間的區別在於,生成器進行延遲評估,它根據需要生成值,迭代器在每次迭代中計算值並將它們存儲在內存中。 發電機組對於巨大的迴路比較好,因爲它們在此時僅「保持」一個值。

+1

爲什麼interator必須在開始時創建值?它可以在「下一個」方法中生成每個新值 – Aivar

+0

@razi:對不起,這不是迭代器在Python中的工作方式。迭代器可以和發生器一樣懶。 – nneonneo

+0

你能給我一個懶惰的迭代器的例子嗎? 我誠實地認爲/認爲只有發電機可以這樣工作,即時生成價值,而其他人則將其存儲在內存中。 – razi