解析Python中的產生器及其與迭代器的差異,python產生器
產生器
產生器是一種迭代器,是一種特殊的函數,使用yield操作將函數構造成迭代器。普通的函數有一個入口,有一個傳回值;當函數被調用時,從入口開始執行,結束時返回相應的傳回值。產生器定義的函數,有多個入口和多個傳回值;對產生器執行next()操作,進行產生器的入口開始執行代碼,yield操作向調用者返回一個值,並將函數掛起;掛起時,函數執行的環境和參數被儲存下來;對產生器執行另一個next()操作時,參數從掛起狀態被重新調用,進入上次掛起的執行環境繼續下面的操作,到下一個yield操作時重複上面的過程。Python的迴圈操作與C語言的實現不同,如果使用List等資料結構需要耗費大量的內容;迴圈操作中使用產生器只需要在記憶體中執行個體化一個對象,可以減少記憶體佔用,提高迴圈操作的執行速度。
>>>def myG():... yield 1... yield 2... yield 3...>>>g=myG()>>>next(g)1>>>next(g)2>>>next(g)3>>>next(g)Traceback (most recent call last): File "<stdin>", line 1, in <module>StopIteration>>>g2=myG()>>>for i in g2:... print(i)123
產生器運算式
for...[if]...語句可以簡潔的構建一個List,同時也可以用來構建產生器。
>>>a=[7,8,9]>>>b=[i**2 for i in a]>>>b[49, 64, 81]>>>ib=(i**2 for i in a)>>>ib<generator object <genexpr> at 0x7f72291217e0>>>>next(ib)49>>>next(ib)64>>>next(ib)81>>>next(ib)Traceback (most recent call last): File "<stdin>", line 1, in <module>StopIteration
迭代器(Iterator)與產生器(Generator)的區別
迭代器是一個更抽象的概念,任何對象,如果它的類有next方法(next python3)和iter方法返回自己本身。
每個產生器都是一個迭代器,但是反過來不行。通常產生器是通過調用一個或多個yield運算式構成的函數s產生的。同時滿足迭代器的定義。
當你需要一個類除了有產生器的特性之外還要有一些自訂的方法時,可以使用自訂的迭代器,一般來說產生器更方便,更簡單。
def squares(start, stop): for i in xrange(start, stop): yield i*i
等同於產生器運算式:
(i*i for i in xrange(start, stop))
列表推倒式是:
[i*i for i in xrange(start, stop)]
如果是構建一個自訂的迭代器:
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
此時,你還可以定義自己的方法如:
def current(self): return self.start
兩者的相同點:對象迭代完後就不能重寫迭代了。