日期:20170926
生成器內有乙個方法send,可再次傳入乙個值。
上面那句可能聽不懂,但是不要緊,我們先來看看**,
#!/usr/bin/python3
defmygenerator
(): value=yield
1yield 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
1i 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可以和生成器互動,傳入乙個值。
大家有沒有想過,如果生成器還沒啟動過,就用send,會怎樣?我們來試一下。
**,
#!/usr/bin/python3
defmygenerator
(): value=yield
1yield 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
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啟動
其實上面報錯已經說了,can』t send non-none value。
所以啊,我們可以用send(none)來啟動生成器。
**,
#!/usr/bin/python3
defmygenerator
(): value=yield
1yield value
return done
gen=mygenerator()
print(gen.send(none))
print(gen.send(3))
執行,
[penx@ali01 python]$ ./gen_send.py 13
[penx@ali01 python]$
結果,
正常執行。
python 生成器方法
生成器支援close 方法,throw 方法,send 方法 1.close 方法 呼叫不用引數,手動關閉生成器函式,後面的呼叫會直接返回stopiteration異常。def g4 yield 1yield 2yield 3g g4 print g.next 1 g.close print g.n...
Python筆記 生成器
日期 20170925 python中有乙個很有趣的東東,叫生成器。我們先來看看簡單的 1,usr bin python3 defmygenerator for n in range 1,4 yield n return done print mygenerator print num mygene...
python生成器筆記
生成器 自動實現了迭代器協議 物件必須提供乙個next方法,執行改方法要麼返回迭代中的下一項,要麼就引起乙個stopiteration的異常,以終止迭代 只能往後走不能往前進 第一種形式 idter i for i in range 10 idter為乙個生成器,有next 方法,idter.nex...