第一次看到y(tǒng)ield是在python學(xué)習(xí)手冊(cè)上茸苇,在python表達(dá)式操作符這一節(jié):
操作符 :yield x 描述:生成器函數(shù)發(fā)送協(xié)議
然后本菜鳥(niǎo)陷入了懵逼,生成器函數(shù)發(fā)送協(xié)議什么鬼。。于是乎,開(kāi)始搜索偷拔。
首先看一個(gè)例子:
def fab(max):
n, a, b = 0, 0, 1
while n < max:
yield b
a, b = b, a + b
n = n + 1
for n in fab(5):
... print(n)
打印的結(jié)果為1,1,2,3,5
yield的作用就是把函數(shù)變成一個(gè)迭代器,python解釋器會(huì)將他視為一個(gè)generator,調(diào)用fab(5)不會(huì)執(zhí)行fab函數(shù)莲绰,而是在for循環(huán)時(shí)每次執(zhí)行一次fab函數(shù)欺旧,執(zhí)行到y(tǒng)ield就是返回一個(gè)值(這是有點(diǎn)類似于return),下次迭代時(shí)將從yield下一行開(kāi)始執(zhí)行蛤签。循環(huán)第一次到y(tǒng)ield b時(shí)返回b的值辞友,b為1,a為0,第二次返回b的值震肮,a=1,b為0+1=1称龙,第三次為1+1=2,
函數(shù)有了yield之后,
函數(shù)加()就變成了生成器
函數(shù)中如果有return就代表生成器的中止戳晌,會(huì)直接報(bào)錯(cuò)
生成器有一個(gè)send方法鲫尊,send有一個(gè)參數(shù),該參數(shù)指定的是上一次被掛起的yield語(yǔ)句的返回值沦偎。send()之前要代碼需停在yield那一行疫向,比如先調(diào)用一個(gè)next()方法