生成器物件send()和next()函式
一面問到的問題。做個記錄。
send和next要結合yield一起看:https://blog.csdn.net/qq_21210467/article/details/82873870
def MyGenerator():
value = (yield 10)
value = (yield value)
gen = MyGenerator()
print(next(gen))
print (gen.send(2))
輸出結果:
10
2
解析:
send:Resumes the generator and "sends" a value that becomes the result of the current yield-expression.
就是說 這裡yield 1整體被視為一個表示式,你send的內容會作為這個表示式的值,隨便你左邊用什麼東西接收或者不接收,總之yield就是你send進來的那個東西。這個表示式變成你send進來後的東西后繼續執行,再次遇到yield,輸出yield後面跟著的表示式。這部分轉自:
python3.x裡面。生成器的next呼叫是next(物件名)的方式,而在python2.x中是物件名.next()的方式,python2中.next()用於啟動生成器。next不傳入引數等價於.send(None),當有yield語句時正常執行。如上面的程式碼,當在呼叫next(gen)時next(gen)只執行到第一個yield並且只執行yield 10這一句話,直接將yield函式後面的10輸出,”value=“部分用來接收下一次send進來的值。然後跳出MyGenerator(),程式碼執行print (gen.send(2))時候進入MyGenerator()函式將2賦值給value,相當於value=2這句話執行,接著繼續執行語句value = (yield value),此時執行yield value,將value的值輸出。yield value可以理解為自帶輸出功能。yield value不管左邊有沒有接收值,都是執行yield value的部分,他們是一個整體,
同時y()函式體中運行了多少次yield那麼久只能對函式體的例項物件進行幾次操作,如果次數大於yield的次數就會報錯。操作包括send()和next()。見下圖:
當然,如果value的值在函式體中有實質的區域性值,無論send()什麼值,都是輸出value的區域性值。
另外,next也是可以直接輸出值的,但是yield後面沒有接value的時候,預設輸出為None,注意是None而不是0,可以由print得到None的顯示。
如果上面看完還不明白的話自己動手寫點小程式碼就明白了,還有這裡有個例子:
講的挺好的。