1. 程式人生 > >python yield 和 yield from用法總結

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 in wrap: print(i,end=' ') print('\n使用yield from代替for迴圈') def f_wrapper2(f): yield from f#注意此處必須是一個可生成物件 wrap = f_wrapper2(fab3(5)) for in wrap: print(i,end=' ') print('\n---------------------') print('yield from包含多個子程式') def g(x): yield from range(x, 0, -1) yield