前言:很多python教程中,對python的解釋不容易理解,本文記錄自己的理解和體會,是對迭代器和生成器的初步理解。
迭代器:
迭代器的實質是實現了next()方法的對象,常見的元組、列表、字典都是迭代器。
迭代器中重點關注兩種方法:
__iter__方法:返回迭代器自身。可以通過python內建函數iter()調用。
__next__方法:當next方法被調用的時候,迭代器會返回它的下一個值,如果next方法被調用,但迭代器沒有只可以返回,就會引發一個StopIteration異常。該方法可以通過 python 內建函數next()調用。
舉例
內建函數iter()可以從可迭代對象中獲得迭代器。
>>> it = iter([1,2,3]) >>> next(it) 1 >>> next(it) 2 >>> next(it) 3 >>> next(it) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration >>>
生成器:
簡單的說,生成是包含yield關鍵字的函數。本質上來說,關鍵字yield是一個語法糖,內部實現支持了迭代器協議,同時yield內部是一個狀態機,維護着掛起和繼續的狀態。
那么,生成器是怎么調用執行的呢?只需要了解下面幾條規則即可:
a. 當生成器被調用的時候,函數體的代碼不會被執行,而是會返回一個迭代器,其實,生成器函數返回生成器的迭代器。 “生成器的迭代器”這個術語通常被稱作”生成器”。要注意的是生成器就是一類特殊的迭代器。作為一個迭代器,生成器必須要定義一些方法,其中一個就是next()。如同迭代器一樣,我們可以使用next()函數來獲取下一個值。需要明白的是,這一切都是在yield內部實現的。
b. 當next()方法第一次被調用的時候,生成器函數才開始執行,執行到yield語句處停止
next()方法的返回值就是yield語句處的參數(yielded value)
當繼續調用next()方法的時候,函數將接着上一次停止的yield語句處繼續執行,並到下一個yield處停止;如果后面沒有yield就拋出StopIteration異常。
c.每調用一次生成器的next()方法,就會執行生成器中的代碼,知道遇到一個yield或者return語句。yield語句意味着應該生成一個值(在上面已經解釋清楚)。return意味着生成器要停止執行,不在產生任何東西。
d. 生成器的編寫方法和函數定義類似,只是在return的地方改為yield。生成器中可以有多個yield。當生成器遇到一個yield時,會暫停運行生成器,返回yield后面的值。當再次調用生成器的時候,會從剛才暫停的地方繼續運行,直到下一個yield。生成器自身又構成一個循環器,每次循環使用一個yield返回的值。