前言:不少python教程中,對python的解釋不容易理解,本文記錄本身的理解和體會,是對迭代器和生成器的初步理解。python
迭代器:函數
迭代器的實質是實現了next()方法的對象,常見的元組、列表、字典都是迭代器。spa
迭代器中重點關注兩種方法:code
__iter__方法:返回迭代器自身。能夠經過python內建函數iter()調用。對象
__next__方法:當next方法被調用的時候,迭代器會返回它的下一個值,若是next方法被調用,但迭代器沒有隻能夠返回,就會引起一個StopIteration異常。該方法能夠經過 python 內建函數next()調用。 blog
舉例
教程
內建函數iter()能夠從可迭代對象中得到迭代器。it
>>> 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 >>>
生成器:io
簡單的說,生成是包含yield關鍵字的函數。本質上來講,關鍵字yield是一個語法糖,內部實現支持了迭代器協議,同時yield內部是一個狀態機,維護着掛起和繼續的狀態。ast
那麼,生成器是怎麼調用執行的呢?只須要了解下面幾條規則便可:
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返回的值。