#!/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
結果,
正常運行。