2016-11-23 35 views
1

我有一個程序下面,我試圖瞭解一個迭代器和一個generator.I得到一個生成器是一個迭代器和more之間的區別。 我很欣賞這些生成器是生成迭代器的簡潔方法。 但比其他簡潔是有一些其他的功能,發電機提供的迭代器不Python3迭代器vs發生​​器

def squares(start, stop): 
    for i in range(start, stop): 
     yield i * i 

generator = squares(1, 10) 

print(list(generator)) 


class Squares(object): 
    def __init__(self, start, stop): 
     self.start = start 
     self.stop = stop 

    def __iter__(self): 
     return self 

    def __next__(self): 
     if self.start >= self.stop: 
      raise StopIteration 
     current = self.start * self.start 
     self.start += 1 
     return current 


iterator = Squares(1, 10) 

l = [next(iterator) for _ in range(1,10)] 
print(l) 
+2

您是否閱讀過關於該主題的一些答案?例如http://stackoverflow.com/questions/2776829/difference-between-pythons-generators-and-iterators – idjaw

+0

另外,我發現這篇文章很有趣:https://www.oreilly.com/ideas/2-great-benefits- python-generators-and-how-they-changed-me-forever – elethan

+0

@idjaw - 我已經從你提供的鏈接中取得了這個例子。 – liv2hak

回答

2

自己張貼是等價的兩個例子。

發生器對迭代器(不是生成器)提供的主要優點是生成器使用更少的內存,可以更快,並且可以在無限流上使用。

當您使用迭代器時,最終要返回的所有項目都會計算出來,然後返回第一個元素。

使用一個生成器,第一個元素在計算第二個元素之前返回。

+0

你的意思是'print(list(generator))'與使用'iterator'的列表理解相比,每次產生一個項目? – liv2hak

+1

他們都一次計算一個。他們返回每個對象的區別。想象一下,我有非常大的(TB)文件,我想要做些什麼。如果我有一臺能夠將第一行讀入內存的發生器,那麼讓它讓我操作。然後它會讀取第二行。所以,即使文件可能很大,甚至無限大,生成器也不需要多條線路在內存中。另一方面,迭代器會將第一行讀入內存,然後讀取第二行等等。它會在返回第一行之前嘗試將整個文件讀入內存。 – Batman

+0

感謝您的解釋。你可能會指點我一個例子,它強調了迭代器和生成器之間的區別(即處理大文件的一個例子) – liv2hak