1. 程式人生 > >Python 中的yield 以及 generator

Python 中的yield 以及 generator

python 中的yield 以及generator

本篇文章淺談python中的yield以及generator。很早就接觸到了python生成器,當時在使用python2.7研究range 和xrange的區別,瞭解到xrange是一個生成器,而在python3中range直接就是生成器。就拿range與xrange比較得知,range產生一個列表,並且列表中的資料全部放置於記憶體中,如果我們要訪問一個無限長列表中的某一個符合條件的資料時(比如斐波那契序列中的某一個數據),range的序列會儲存在記憶體中,現在不可能採用這種方式,此時xrange就起作用了,xrange會儲存當前訪問資料的下一個資料地址,每一次訪問的時候返回一個數據,不會將所有的資料壓如記憶體,因此可以解決訪問無限長資料的問題。而要構建一個生成器就必須使用yield。yield的功能類似於return,區別在於函式中有return 每一次呼叫該函式從函式頭部執行到return位置返回return對應的值,return後內容不再執行,只要引數一樣,無論呼叫多少次返回結果一樣。而yield就不同了,可以將yield理解為等待呼叫(因為在多執行緒中yield功能是等待執行緒結束)。每一次呼叫含有yield的函式(即是generator)返回當前yield後面的值,然後yield後面內容繼續執行。如果要保證生成器多次呼叫有效,那麼yield一般放在迴圈裡面,保證生成器每次執行完呼叫後會再次迴圈到yield位置等待呼叫。廢話不多說,上程式碼:

例項一:最簡單的yield

def gen1(n):
    print('generator runs')
    res = 0
    i = 0
    while i<n:
        yield i
        i = i+1
if __name__ == '__main__':
    for item in gen1(10):
        print(item)

輸出從0-(N-1)的資料
輸出結果:

10number

例項二:生成器產生斐波那契序列

輸出前N個斐波那契序列中的資料程式碼如下:

def gen2(n):
    i = 0
rpre = 1 pre = 1 cur = 0 while i<n: if i<2: yield 1 else: cur = rpre + pre yield cur rpre = pre pre = cur i = i+1 if __name__ == '__main__': for item in gen2(20): print(item)

生成前20個斐波那契序列資料:

20斐波那契