yield 是一個類似 return 的關(guān)鍵字,只是這個函數(shù)返回的是個生成器。
>>> def createGenerator() :
... mylist = range(3)
... for i in mylist :
... yield i*i
...
>>> mygenerator = createGenerator() # create a generator
>>> print(mygenerator) # mygenerator is an object!
<generator object createGenerator at 0xb7555c34>
>>> for i in mygenerator:
... print(i)
0
1
4
作者:NearTan
鏈接:http://www.itdecent.cn/p/84e66ced656f
來源:簡書
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
這個例子沒什么用途,但是它讓你知道,這個函數(shù)會返回一大批你只需要讀一次的值.
為了精通 yield ,你必須要理解:當(dāng)你調(diào)用這個函數(shù)的時候,函數(shù)內(nèi)部的代碼并不立馬執(zhí)行 ,這個函數(shù)只是返回一個生成器對象,這有點(diǎn)蹊蹺不是嗎。那么,函數(shù)內(nèi)的代碼什么時候執(zhí)行呢?當(dāng)你使用for進(jìn)行迭代的時候.
現(xiàn)在到了關(guān)鍵點(diǎn)了!
第一次迭代中你的函數(shù)會執(zhí)行,從開始到達(dá) yield 關(guān)鍵字,然后返回yield 后的值作為第一次迭代的返回值. 然后,每次執(zhí)行這個函數(shù)都會繼續(xù)執(zhí)行你在函數(shù)內(nèi)部定義的那個循環(huán)的下一次,再返回那個值,直到?jīng)]有可以返回的。
如果生成器內(nèi)部沒有定義 yield 關(guān)鍵字,那么這個生成器被認(rèn)為成空的。這種情況可能因?yàn)槭茄h(huán)進(jìn)行沒了,或者是沒有滿足if/else 條件。