前言
yield的英文單詞意思是生產(chǎn),剛接觸Python的時候感到非常困惑,一直沒弄明白yield的用法。最近又重新學(xué)習(xí)了下,所以整理了下面這篇文章,供自己和大家學(xué)習(xí)參考,下面話不多說了,來一起看看詳細的介紹吧。
先來看一個例子
def foo(): print("starting...") while True: res = yield print("res:",res)g = foo()next(g)在上面的例子里,因為foo函數(shù)中有yield關(guān)鍵字,所以foo()函數(shù)的執(zhí)行結(jié)果g是一個生成器,此時可以使用next(g)或者g.__next__()方法觸發(fā)生成器的執(zhí)行
程序的執(zhí)行結(jié)果為
starting...
使用next(g)觸發(fā)生成器的執(zhí)行時,程序會按照正常的順序從上向下執(zhí)行,遇到y(tǒng)ield,程序就會暫停
并把yield后面所接的值返回
打印next(g)的執(zhí)行結(jié)果
def foo(): print("starting...") while True: res = yield print("res:",res)g = foo()print(next(g))程序執(zhí)行結(jié)果
starting...None
在上面的例子里,執(zhí)行一次next(g)方法,程序暫停在yield那一行,此時再次調(diào)用next(g),程序會從yield語句那一行繼續(xù)向下運行
修改上面的代碼,多調(diào)用幾次next方法,并打印next方法的返回結(jié)果
def foo(): print("starting...") while True: res = yield print("res:",res)g = foo()print(next(g))print("*"*20)print(next(g))上面這段代碼的執(zhí)行結(jié)果為
starting...None********************res: NoneNone
可以看到,程序確實按猜想的步驟運行,但是上面的程序也有一個很明顯的缺點:那就是上面的代碼沒有任何的實際意義:res的值永遠為None
在實際的開發(fā)中,使用yield表達式形式的目的是yield可以得到一個值,然后yield把這個值賦值給某個變量,這樣才有實際意義
那應(yīng)該怎么操作才能為res變量賦一個值呢??那就是調(diào)用生成器自身的send方法
send方法可以觸發(fā)一次生成器執(zhí)行,同時還可以把send方法的參數(shù)傳遞給yield
修改上面的代碼
def foo(): print("starting...") while True: res = yield print("res:",res)g = foo()next(g)print(g.send(5))程序的執(zhí)行結(jié)果為:
starting...res: 5None
來分析一下上面的代碼的執(zhí)行過程 :
1.程序開始執(zhí)行以后,因為foo函數(shù)中有yield關(guān)鍵字,所以foo函數(shù)并不會真的執(zhí)行,而是先得到一個生成器g.
2.直到調(diào)用next方法,foo函數(shù)正式開始執(zhí)行,先執(zhí)行foo函數(shù)中的print方法,然后進入while循環(huán)
3.程序遇到y(tǒng)ield關(guān)鍵字,程序暫停,此時next(g)語句執(zhí)行完成
新聞熱點
疑難解答
圖片精選