python中迭代器和生成器

2021-08-21 08:58:49 字數 1365 閱讀 8257

迭代器:

迭代器的實質是實現了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

"", line 1, in

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返回的值。

python中迭代器和生成器

1 迭代器 iterator 是乙個實現了迭代器協議的物件,python的一些內建資料型別 列表,陣列,字串,字典等 都可以通過for語句進行迭代,我們也可以自己建立乙個容器,實現了迭代器協議,可以通過for,next方法進行迭代,在迭代的末尾,會引發stopiteration異常。迭代器有兩個基本...

python中迭代器和生成器

這裡的迭代可以指for迴圈,在python中,對於像list,dict和檔案等而言,都可以使用for迴圈,但是它們並不是迭代器,它們屬於可迭代物件。1.1什麼可迭代物件 最簡單的解釋 可以使用for.in.語句進行迴圈的物件,就是可迭代物件 iterable 可以使用isinstance 方法進行判...

Python迭代器和生成器

先說迭代器,對於string list dict tuple等這類容器物件,使用for迴圈遍歷是很方便的。在後台for語句對容器物件呼叫iter 函式,iter 是python的內建函式。iter 會返回乙個定義了next 方法的迭代器物件,它在容器中逐個訪問容器內元素,next 也是python的...