python 迭代器 生成器

2021-08-27 19:01:53 字數 1578 閱讀 9714

知識背景:

1 呼叫乙個普通的python函式時,一般是從函式的第一行**開始執行,結束於return語句、異常或者函式結束(可以看作隱式的返回none)

2 一旦函式將控制權交還給呼叫者,就意味著全部結束。函式中做的所有工作以及儲存在區域性變數中的資料都將丟失

3 再次呼叫這個函式時,一切都將從頭建立。

4 如上流程其實是呼叫乙個標準函式的過程,而且乙個標準函式只能返回乙個值

需求來了:

建立能產生乙個序列的函式

此時出現了關鍵字 yield應用而生:

return: 函式將執行**的控制權返回給函式呼叫者

yield: 控制權的轉移是臨時和自願的,我們的函式將來還會收回控制權

帶有yield關鍵字的函式叫做生成器,這個生成器就完成了返回乙個序列的函式的目的。

那麼生成器函式和普通標準函式區別在**呢?

2 生成器函式也可以有return

3 生成器函式返回生成器的迭代器,俗稱生成器。

4 可以使用方法 next()從生成器中得到下乙個值

5 每次生成器被呼叫時,其內部使用yield返回數值給呼叫者,並記錄當前執行狀態,

也就是說 yield是專門給生成器使用的特殊return

案例擴充套件:

def fab(max): 

n, a, b = 0, 0, 1

while n < max:

yield b

# print b

a, b = b, a + b

n = n + 1

>>> for n in fab(5):

... print n

解釋如下:

1 呼叫時 返回迭代器(此時函式體是不會執行的,只有在呼叫返回的迭代器next()方法或者用for迴圈遍歷時--for迴圈會自動呼叫迭代器的next(),並)

2 for的每一次迴圈,會執行fab函式體,即執行迭代器的一次迭代,迭代的內容是執行到函式體yield,返回迭代值。

3 執行for的第二次迴圈,執行fab函式,即執行第二次迭代,第二次迭代是從上次迭代執行中斷處yield b的下乙個語句繼續執行,然後執行到下乙個yield b返回迭代值,再次中斷。

4 yield將每次中斷做了記錄,把乙個函式改寫為乙個 generator 並持有了迭代能力

5 區分 fab 和 fab(5),fab 是乙個 generator function,而 fab(5) 是呼叫 fab 返回的乙個 generator,好比類的定義和類的例項的區別

可以使用來驗證上述幾條:

>>> f = fab(5)

>>> f.next() 這裡迭代器的next() 和 for n in fab(5): 中執行每一次迴圈的執行效果是一樣的,我們用 f.next()來驗證上述執行的1,2,3步驟

1 >>> f.next()

1 >>> f.next()

2 >>> f.next()

3 >>> f.next()

5

Python 迭代器 生成器

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

python 迭代器,生成器

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

python 迭代器,生成器

以直接作用於 for 迴圈的資料型別有以下幾種 一類是集合資料型別,如 list tuple dict set str 等 一類是 generator 包括生成器和帶 yield 的generator function 這些可以直接作用於 for 迴圈的物件統稱為可迭代物件 iterable pyt...