Python 中的yield 以及 generator
阿新 • • 發佈:2018-12-05
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)的資料
輸出結果:
例項二:生成器產生斐波那契序列
輸出前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個斐波那契序列資料: