您好,登錄后才能下訂單哦!
本文簡短翻譯自鏈接 StackOverflow。
在理解yield之前,你必須先知道iterable(迭代器)和generator(生成器)。
當(dāng)你創(chuàng)建一個list,你能一個接一個讀取list的每一項(xiàng)。能一個接一個讀取每一項(xiàng)的就是迭代器。
>>> mylist = [1, 2, 3]
>>> for i in mylist:
... print(i)
1
2
3
mylist是一個iterable,當(dāng)你用列表推導(dǎo)式生成一個列表,也是iterable
>>> mylist = [x*x for x in range(3)]
>>> for i in mylist:
... print(i)
0
1
4
一切能用for.......in.......
的都是迭代器,例如lists,strings,files。。。
generator是一種只能迭代一次的iterable。生成器不會再內(nèi)存中儲存值,它只會在程序運(yùn)行的時候生成值。
>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
... print(i)
0
1
4
它和上面的不同僅僅是把`[]
替換成()
。生成器只能使用一次。
yield和return的用法相似,只是,使用yield函數(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
當(dāng)你需要使用大量只需要使用一次的數(shù)據(jù)時,你就可以使用yield。
你需要知道的時,當(dāng)你調(diào)用createGenerator()這個函數(shù)時,函數(shù)里面的代碼并不會運(yùn)行,函數(shù)會返回一個生成器對象。
每次對生成器對象用for,函數(shù)里面的代碼都會運(yùn)行一次。
以下是理解的關(guān)鍵部分:
for的每次循環(huán),函數(shù)里面的代碼都會執(zhí)行,直到遇到y(tǒng)ield,然后把值返回。當(dāng)循環(huán)到頭了或者函數(shù)不滿足"if...else"條件時,生成器為空。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。