python 生成器 send


 

#!/usr/bin/python3

def MyGenerator():
        value=yield 1
        yield value
        return done

gen=MyGenerator()
print(next(gen))
print(gen.send("I am Value"))

 

 

生成器內有一個方法send,可再次傳入一個值。


上面那句可能聽不懂,但是不要緊,我們先來看看代碼,

#!/usr/bin/python3 def MyGenerator(): value=yield 1 yield value return done gen=MyGenerator() print(next(gen)) print(gen.send("I am Value"))

 

代碼分析, 
在MyGenerator里,我們一共用了兩次yield。 
比較奇怪的是第一個yield的語句,value=yield 1。如果沒看過這一語句的,肯定不知道next回到yield后,其實是有一個值的。

到這,我們先不急,運行代碼先,

[penx@ali01 python]$ ./gen_send.py 1 I am Value [penx@ali01 python]$ 

運行過程, 
用next啟動了生成器gen,知道到yield 1時返回1。

然后我們再用gen的內部方法send進入gen,而且還帶回來一個值“I am Value”。這時候,繼續執行yield 1后的代碼“value=”,把帶回來的值“I am Value”賦給value。直到遇到yield value,把value返回。


其實,send和next的執行很像,只是send可以和生成器互動,傳入一個值。


生成器的啟動需要next

大家有沒有想過,如果生成器還沒啟動過,就用send,會怎樣?我們來試一下。 
代碼,

#!/usr/bin/python3 def MyGenerator(): value=yield 1 yield value return done gen=MyGenerator() print(gen.send(3))

 

運行,

[penx@ali01 python]$ ./gen_send.py Traceback (most recent call last): File "./test.py", line 9, in <module> print(gen.send(3)) TypeError: can't send non-None value to a just-started generator [penx@ali01 python]$ 

 

 

結果, 
報錯,

TypeError: can’t send non-None value to a just-started generator

說生成器剛啟動時,不能send一個不為None的值。

小結, 
所以呢,我們在用生成器時,第一次要用next啟動


生成器啟動可用send(None)

其實上面報錯已經說了,can’t send non-None value。 
所以啊,我們可以用send(None)來啟動生成器。 
代碼,

#!/usr/bin/python3 def MyGenerator(): value=yield 1 yield value return done gen=MyGenerator() print(gen.send(None)) print(gen.send(3))

運行,

[penx@ali01 python]$ ./gen_send.py 1 3 [penx@ali01 python

結果, 
正常運行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM