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