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.下面是運作結果: