python的yield與send實例詳解

首先看兩段代碼及其輸出

def gener(num):
    while True:
        print("0:before yield num is: %d" % num) 
        num = yield 
        print("1:after yield num  is %d" % num) 
    print("exc end")

g = gener(1)
g.send(None)
print("goto loop")
for i in range(5):
    print("---loop---")
    print(">>>>send back:" + str(g.send(i)))


# 輸出為 >>
0:before yield num is: 1
goto loop
---loop---
1:after yield num  is 0
0:before yield num is: 0
>>>>send back:None
---loop---
1:after yield num  is 1
0:before yield num is: 1
>>>>send back:None

def gener(num):
    while True:
        print("0:before yield num is: %d" % num) 
        num = yield num**2 # 代碼唯一有變化的地方
        print("1:after yield num  is %d" % num) 
    print("exc end")

g = gener(1)
g.send(None)
print("goto loop")
for i in range(5):
    print("---loop---")
    print(">>>>send back:" + str(g.send(i)))


# 輸出為 >>
0:before yield num is: 1
goto loop
---loop---
1:after yield num  is 0
0:before yield num is: 0
>>>>send back:0
---loop---
1:after yield num  is 1
0:before yield num is: 1
>>>>send back:1

分析

generator函數調用后,第一次send(None),generator執行到yield之前,之后每次調用send(), 從yield所在行開始執行,運行到片段結尾或再次遇到yield, generator從yield中接受參數,如果yield后有表達式,則返回表達式的值,類似return關鍵字的功能。yield關鍵字保存了generator每次的執行狀態。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容