最近看代碼看到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ì)象。
    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ù)雜的代碼事例。