Python生成器next方法和send方法區(qū)別詳解
yield的語(yǔ)法規(guī)則是:
在yield這里暫停函數(shù)執(zhí)行,并返回yield后面表達(dá)式的值(默認(rèn)為None),直到被next()再次調(diào)用時(shí),從上次暫停的yield代碼處繼續(xù)往下執(zhí)行。當(dāng)沒(méi)有可繼續(xù)next()時(shí),拋出異常,該異常可被for循環(huán)處理。
def fib(n):
def fib(n): a, b = 0, 1 i = 0 while i < n: yield b a, b = b, a+b i += 1if __name__ == ’__main__’: f = fib(10) for item in f: print(item)
python中,含有yield關(guān)鍵字的對(duì)象就是一個(gè)生成器,每次調(diào)用next方法時(shí)會(huì)執(zhí)行到y(tǒng)ield后面的語(yǔ)句,然后返回yield后面代碼塊的執(zhí)行結(jié)果
def foo(): bar_a = yield 1 # bar_a是語(yǔ)句塊(yield 1)的返回值,默認(rèn)為None bar_b = yield bar_a yield '最后一個(gè)值,再迭代就要報(bào)StopIteration了'f = foo() # 創(chuàng)建生成器,此時(shí)沒(méi)有執(zhí)行foo()里的任何語(yǔ)句print(next(f)) # 從foo()里進(jìn)入,一直執(zhí)行到(yield 1)處,此時(shí)變量bar_a還沒(méi)有創(chuàng)建print(next(f)) # 先將語(yǔ)句塊(yield 1)的返回值賦值個(gè)bar_a,此時(shí)bar_a的值是None。 # 然后執(zhí)行到語(yǔ)句塊(yield bar_a),bar_b也還沒(méi)有被創(chuàng)建print(next(f)>>>1>>>None>>>最后一個(gè)值,再迭代就要報(bào)StopIteration了
send()
def foo(): bar_a = yield 1 bar_b = yield bar_a yield '最后一個(gè)值,再迭代就要報(bào)StopIteration了'f = foo()print(f.send(None)) # 和next(f)的效果一模一樣print(f.send('my lover')) # 覆蓋yield 1語(yǔ)句的返回值print(next(f))>>>1>>>my lover>>>最后一個(gè)值,再迭代就要報(bào)StopIteration了
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. Ajax實(shí)現(xiàn)文件上傳功能(Spring MVC)2. 基于javaweb+jsp實(shí)現(xiàn)學(xué)生宿舍管理系統(tǒng)3. idea設(shè)置代碼格式化的方法步驟4. JS前端模塊化原理與實(shí)現(xiàn)方法詳解5. Java Collection集合遍歷運(yùn)行代碼實(shí)例6. asp createTextFile生成文本文件支持utf87. python使用pyecharts庫(kù)畫地圖數(shù)據(jù)可視化的實(shí)現(xiàn)8. python使用timeit時(shí)間模塊9. 在 PHP 中用描點(diǎn)法“繪制”中文10. Java Synchronized的使用詳解
