python中迭代器和生成器。


前言:很多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返回的值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM