python3之生成器

2021-08-17 05:59:29 字數 1754 閱讀 5122

斐波那契(fibonacci)數列列是乙個非常簡單的遞迴數列,

除第乙個和第二個數外,任意乙個數都可由前兩個數相加

得到。用電腦程式輸出斐波那契數列的前 n 個數是乙個非常簡單的問題,許多初學者都可以輕易寫出如下函式:

def fab(max):

n, a, b = 0, 0, 1

while n < max:

#print b

a, b = b, a + b

n = n + 1

通過對fab函式簡單的修改,就可以將fab函式轉為乙個生成器

def fabs(max):

n, a, b = 0, 0, 1

while n < max:

yield b

#print b

a, b = b, a + b

n = n + 1

yield 的作用就是把乙個函式變成乙個 生成器,帶有 yield 的函式不再是乙個普通函式,python 直譯器會將其視為

乙個 generator,呼叫 fab(5) 不會執行 fab 函式,而是返回乙個 iterable 物件!在 for 迴圈執行時,每次迴圈都會執行 fab

函式內部的**,執行到 yield b 時,fab 函式就返回乙個迭代值,下次迭代時,**從 yield b 的下一條語句繼續執行,

而函式的本地變數看起來和上次中斷執行前是完全一樣的,於是函式繼續執行,直到再次遇到 yield。

也可以手動呼叫 fab(5) 的 next() 方法(因為 fab(5) 是乙個 generator 物件,該物件具有 next() 方法),

這樣我們就可以更清楚地看到 fab 的執行流程:

na = fabs(3)

print(next(na))

>>0

print(next(na))

>>1

print(next(na))

>>2

print(next(na))

>>stopiteration

當函式執行結束時,generator 自動丟擲 stopiteration 異常,表示迭代完成。

在 for 迴圈裡,無需處理 stopiteration 異常,迴圈會正常結束。

yield 的好處是顯而易見的,把乙個函式改寫為乙個 generator 就獲得了迭代能力,比起用類的例項儲存狀態來計算下乙個 next() 的值,不僅**簡潔,而且執行流程異常清晰。

如何判斷乙個函式是否是乙個特殊的 generator 函式?可以利用 isintance(fsbs,genrator) 判斷:

print(isintance(fsbs,genrator))

>>.true

python3生成器 Python3 生成器

python3 生成器 閱讀 125 發布於 2020 05 19 14 29 25 在python中,一邊迴圈一邊計算出元素的機制,稱為生成器 generator。生成器的優點 一次返回乙個結果,延遲計算。這對於大資料量處理,是個非常有用的優勢。占用記憶體量是工程師必須考慮的乙個問題。提高 可讀性...

python3之生成器操作

生成器是python中提供的一種固定語法,按照語法規則呼叫方法,就會獲取乙個條件表示式推導得到的資料,是推導式的延伸。用win r 開啟命令提示符,輸入python。如果專案中需要大量的資料 儲存列表 儲存生成器 有什麼區別?列表 10億個整數,怎麼在列表中儲存?生成器 只是乙個物件,生成10億個資...

十 python3 生成器

生成器 generator 在 python 中,不必建立完整的 list,從而節省大量的空間。一邊迴圈一邊計算的機制。建立乙個 generator,有很多種方法。第一種方法很簡單,只要把乙個列表生成式的 改成 就建立了乙個 generator l x x for x in range 10 l 0...