最近看代碼看到python里面的yield關(guān)鍵字,和我之前接觸的語(yǔ)言好像都沒(méi)有來(lái)著,我就查了查它的含義,大概理解如下:
>>> 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
1.它和return差不多的用法,只是最后是返回了一個(gè)生成器。
2.了解yield 必須知道,當(dāng)你調(diào)用yield所在的那個(gè)函數(shù)的時(shí)候,那個(gè)函數(shù)并沒(méi)有運(yùn)行,只會(huì)返回一個(gè)生成器的對(duì)象。
當(dāng)然 上面的理解來(lái)自于:
3.當(dāng)你第一次在for中調(diào)用生成器的的對(duì)象,它將會(huì)運(yùn)行你函數(shù)中的代碼從最開(kāi)始一直到到碰到了yield的關(guān)鍵字,然后它會(huì)返回循環(huán)中的第一個(gè)值。然后每一次其他的調(diào)用將會(huì)運(yùn)行你在這個(gè)函數(shù)中所寫的循環(huán)多一次,并且返回下一個(gè)值,知道沒(méi)有值可以返回了。
生成器可以認(rèn)為是空的,如果這個(gè)函數(shù)運(yùn)行但是沒(méi)有運(yùn)行到y(tǒng)ield上。這也許是因?yàn)檠h(huán)的結(jié)束,也許是因?yàn)槟銢](méi)有寫一個(gè)安全的if/else。
這里又涉及到生成器的問(wèn)題:
生成器和迭代器差不多,但是它只能運(yùn)行一次,因?yàn)樗皇前阎荡嬖趦?nèi)存中,而是直接運(yùn)行生成值,所以我理解應(yīng)該是定義的時(shí)候需要代碼塊的。
>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator: ... print(i) 0 1 4 >>> for i in mygenerator: ... print(i)
再運(yùn)行一次for就不會(huì)打印出來(lái)東西了。
當(dāng)然 上面的理解來(lái)自于:
http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python
挺好的。
很想吐槽下,我查內(nèi)地的網(wǎng)站的這個(gè)關(guān)鍵字的解釋,給出的代碼實(shí)例就把我繞暈了,并且拆開(kāi)來(lái)看完全沒(méi)有必要給那么復(fù)雜的代碼事例。
浙公網(wǎng)安備 33010602011771號(hào)