天天看點

Python generator和yield的一點了解

1.定義:在Python的函數定義中,如果出現了yield表達式,那麼定義的函數就不再是一個普通的函數,而是一個generator函數,調用這個函數的傳回值就叫generator。

例如:

def produce(l):
    i=0
    while 1:
        if i < 10:
            l.append(i)
            yield
            i=i+1
        else:
            return
           

上面定義的函數因為帶有yield表達式,是以是一個generator函數,該函數可以有return,但是不能帶有任何值。

2.具體使用過程分析:請看下面的代碼

import time
import sys
import datetime
# 生産者
def produce(l):
    print("procuce begin")
    i=0
    while 1:
        if i < 3:
            l.append(i)
            print("produce stop")
            yield
            print("produce continue")
            i=i+1
            time.sleep(5)
        else:
            return
# 消費者
def consume(l):
    p = produce(l)
    while 1:
        try:
            print("before next")
            next(p)
            print("after next")
            while len(l) > 0:
                print(l.pop(),'\n')
        except StopIteration:
            sys.exit(0)
if __name__ == "__main__":
    l = []
    consume(l)
           

上面的代碼首先定義了一個generator函數produce,然後在consume函數中調用了改方法,來實作每隔5秒依次列印數字0、1、2。

代碼運作過程是怎樣的呢?首先是p=produce(l)這裡調用函數的時候,由于produce是一個generator函數,是以函數并不會立即執行,而是暫時挂起,并且傳回一個generator  p,通過檢視p的類型,顯示為<class 'generator'>,然後consume函數進入while循環,首先列印“before next”,接着調用next(p),調用之後就會produce函數就會從挂起狀态開始執行,依次列印“produce begin”、“produce stop”,當遇到yield的時候,generator函數又會挂起,是以就接着傳回consume函數繼續執行,列印“after next”,最後列印清單l中的元素“0”,執行完成之後繼續while循環,重複剛剛的運作順序,直到next(p)抛出StopIteration異常,程式運作結束。

3.下面是運作結果:

Python generator和yield的一點了解

繼續閱讀