python 迭代器 生成器

2021-09-21 06:39:19 字數 1661 閱讀 1239

物件必須提供乙個next方法,執行該方法要麼返回迭代中的下一項,要麼就引起乙個stoplteration 異常,終止迭代(只能往後不能往前退)。

for迴圈中,呼叫物件__iter__()方法,將其變成遵循迭代器協議的迭代物件,再通過其內部的__next__()方法進行依次訪問,從而達到遍歷效果。

可以理解為資料型別,這種資料型別自動實現了迭代器協議(其他資料型別需要呼叫自己內建的__iter__方法),生成器就是可迭代物件。

執行生成器方法:

生成器函式  __next__()

python自帶方法:next(生成器)

.send(引數):生成器函式.send(引數),send中的引數會傳入到當前停止 yield 中。

生成器表現形式:(generatorobject 生成器物件)

生成器函式:與常規函式定義相同,但是使用yield返回結果,在每個結果中間掛起函式,以使下次從它離開的地方繼續執行。

生成器表示式:類似於列表推導,但是生成器按需產生結果的乙個物件,而不是一次構建乙個結果列表。

l = [x + 1 for x in range(10)]

print(l)

# 輸出:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

基本語法:

def 函式名():

yield 返回值

yield 返回值

# yield 特性:與return相同,可以yield多次,可以儲存狀態。

yield 語句是生成器中的關鍵語句,生成器在例項化時並不會被執行,而是等待呼叫其__next__()方法才開始執行。並且當程式執行完yield語句後就會「吼(hold)住」,即保持當前狀態且停止執行,等待下一次遍歷時才恢復執行,並會把 .send(引數) 中的引數傳回到yield。

生成器案例:生產者、消費者模型(吃包子案例)

# 吃包子

def consumer(name):

print('我是[%s],準備開始吃包子了!' % name)

while true:

baozi = yield

print('%s 很開心的把 [%s] 吃掉了。' % (name,baozi))

# 生成包子

def producer():

c1 = consumer('tt')

c1.__next__()

for i in range(10):

c1.send('包子%s' % i)

producer()

執行結果:

我是[tt],準備開始吃包子了!

tt 很開心的把 [包子0] 吃掉了。

tt 很開心的把 [包子1] 吃掉了。

tt 很開心的把 [包子2] 吃掉了。

tt 很開心的把 [包子3] 吃掉了。

tt 很開心的把 [包子4] 吃掉了。

tt 很開心的把 [包子5] 吃掉了。

tt 很開心的把 [包子6] 吃掉了。

tt 很開心的把 [包子7] 吃掉了。

tt 很開心的把 [包子8] 吃掉了。

tt 很開心的把 [包子9] 吃掉了。

Python 迭代器 生成器

可以直接作用於for迴圈的物件,統稱為可迭代物件 iterable。iterator物件表示的是乙個資料流,iterator物件可以被next 函式呼叫並不斷返回下乙個資料,直到沒有資料時丟擲stopiteration錯誤。可以把這個資料流看做是乙個有序序列,但我們卻不能提前知道序列的長度,只能不斷...

python 迭代器,生成器

什麼事迭代 可直接用作與for迴圈的物件統稱為可迭代物件 可以被next 函式呼叫,並不斷返回下乙個值的物件稱為迭代器,所有的iterable均可以通過內建函式iter 來轉變為iterator。對於迭代器來講,有乙個next 就夠了。在你使用for和in語句時,程式就會自動呼叫即將被處理的物件的可...

python 迭代器 生成器

知識背景 1 呼叫乙個普通的python函式時,一般是從函式的第一行 開始執行,結束於return語句 異常或者函式結束 可以看作隱式的返回none 2 一旦函式將控制權交還給呼叫者,就意味著全部結束。函式中做的所有工作以及儲存在區域性變數中的資料都將丟失 3 再次呼叫這個函式時,一切都將從頭建立。...