知識背景:
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...