python yield 和 yield from用法總結
#例1. 簡單輸出斐波那契數列前 N 個數
#缺點:該函式可複用性較差,因為 fab 函式返回 None,其他函式無法獲得該函式生成的數列
#要提高 fab 函式的可複用性,最好不要直接打印出數列,而是返回一個 List。
def fab1(max):
n, a, b = 0, 0, 1
while n < max:
print(b,end=' ')
a, b = b, a + b
n = n + 1
fab1(5)
#例 2.
#缺點:該函式在執行中佔用的記憶體會隨著引數 max 的增大而增大,如果要控制記憶體佔用,
#最好不要用 List 來儲存中間結果,而是通過 iterable 物件來迭代
def fab2(max):
n, a, b = 0, 0, 1
L = []
while n < max:
L.append(b)
a, b = b, a + b
n = n + 1
return L
#例3
#說明:帶有 yield 的函式不再是一個普通函式,Python 直譯器會將其視為一個 generator,
#呼叫 fab(5) 不會執行 fab 函式,而是返回一個 iterable 物件!
#在 for 迴圈執行時,每次迴圈都會執行 fab 函式內部的程式碼,執行到 yield b 時,fab 函式就返回一個迭代值,
#下次迭代時,程式碼從 yield b 的下一條語句繼續執行,而函式的本地變數看起來和上次中斷執行前是完全一樣的,
#於是函式繼續執行,直到再次遇到 yield。
def fab3(max):
n, a, b = 0, 0, 1
while n < max:
yield b
# print b
a, b = b, a + b
n = n + 1
f=fab3(5)
print("f是一個可迭代物件,並沒有執行函式")
print(f)
print('fab3返回的是一個iterable 物件,可以用for迴圈獲取值')
for n in f:
print(n)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#例4:
#說明:yield
from iterable本質上等於for item in iterable: yield item的縮寫版
def
f_wrapper1(f):
for g in f:
yield
g
wrap
= f_wrapper1(fab3(5))
for i in wrap:
print(i,end= '
' )
print( '\n使用yield
from代替for迴圈' )
def
f_wrapper2(f):
yield from f#注意此處必須是一個可生成物件
wrap
= f_wrapper2(fab3(5))
for i in wrap:
print(i,end= '
' )
print( '\n---------------------' )
print( 'yield
from包含多個子程式' )
def
g(x):
yield from range(x,
0, -1)
yield
|