生成器物件send 和next 函式

2021-08-28 13:26:57 字數 1693 閱讀 7734

一面問到的問題。做個記錄。

send和next要結合yield一起看:

def mygenerator():

value = (yield 10)

value = (yield value)

gen = mygenerator()

print(next(gen))

print (gen.send(2))

輸出結果:102

解析: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的部分,他們是乙個整體,如果不寫value,不管send什麼值,輸出都為none。見下圖:

同時y()函式體中執行了多少次yield那麼久只能對函式體的例項物件進行幾次操作,如果次數大於yield的次數就會報錯。操作包括send()和next()。見下圖:

當然,如果value的值在函式體中有實質的區域性值,無論send()什麼值,都是輸出value的區域性值。

另外,next也是可以直接輸出值的,但是yield後面沒有接value的時候,預設輸出為none,注意是none而不是0,可以由print得到none的顯示。

如果上面看完還不明白的話自己動手寫點小**就明白了,還有這裡有個例子:

講的挺好的。

生成器中的send

import time def foo print start print this is the first line r1 yield r1 print this is the second value s r1 r2 yield r2 print this is the third value...

python生成器中yield和send分析

在python中生成器是指用 實現迭代器的的功能本質還是迭代器,只不過是 實現迭代器功能。在python中生成器是由函式實現的,通常我們在函式中加入yeild就可以實現生成器。定義乙個函式 def func print 111 yield 3 print 222 g func 執行上面 你會發現函式...

Python筆記 生成器方法send

日期 20170926 生成器內有乙個方法send,可再次傳入乙個值。上面那句可能聽不懂,但是不要緊,我們先來看看 usr bin python3 defmygenerator value yield 1yield value return done gen mygenerator print ne...