yield的表示式形式的應用(待補充)
阿新 • • 發佈:2018-12-04
1、yield的表示式形式應用的定義:
在一個生成器函式內,將yield賦值給一個變數,這就是yield的表示式形式。也叫生成器的表示式形式
2、send方法的定義:
(1)定義:
yield的表示式形式下面有一個send方法,它的作用與next方法是一樣的,都是在觸發函式繼續往下走。除了具有next的功能外,還具有傳值的效果。send傳值的方式是先把要傳的值交給yield,再由yield賦值給事先定義的變數名,最後才觸發next效果.
def foo(): print('start') while True: x=yield print('value:',x) g=foo()#得到一個生成器 next(g)#初始化生成器,實際上已經開始執行函數了,列印start,遇到yield暫停 g.send(1)#send先將1傳給上一次yield暫停的位置,再由yield把'1'賦值給x,最後函式再接著往下走,直到碰到yield函式才暫停
#start
#value:1
(2)補充:
send(None):把None傳給yield,相當於不傳值,只有next效果,等同於'next(生成器變數)',一般用於生成器變數的初始化操作
3、yield表示式形式的初始化
定義:
生成器一定要走到一個暫停的位置,然後才能send傳值,因為send的特性是基於一個已經暫停的yield進行傳值然後再接著往下走
如果對生成器表示式形式不進行初始化操作而直接進行傳值則會報以下錯誤:
TypeError: can't send non-None value to a just-started generator(無法將非None值傳送到剛啟動的生成器)
解決方法:所以必須先send一個None給生成器表示式形式或next(g)
例一:
先傳一個None給生成器,否則直接報錯
def foo(): print('start') while True: x = yield print('value:',x) g = foo() #得到生成器 print(g.send(None)) # g.send(None)一般用於初始化生成器。 # 它傳了一個空值給函式,相當於直接執行了next(g) # 如果不初始化則會報以下錯誤: # TypeError: can't send non-None value to a just-started generator print('---------------------------') print(g.send(1)) # 先將數字1傳給yield,,再執行next(g),所以列印函式返回值的結果還是None。 print('---------------------------') print(g.send(2)) # 先將數字2傳給yield,,再執行next(g),所以列印函式返回值的結果還是None。 print('---------------------------') print(next(g))
輸出結果:
start None --------------------------- value: 1 None --------------------------- value: 2 None --------------------------- value: None None