python中yield關鍵字怎麼理解?

本文簡短翻譯自鏈接 StackOverflow
在理解yield之前,你必須先知道iterable(迭代器)和generator(生成器)。

iterable

當你創建一個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

generator是一種只能迭代一次的iterable。生成器不會再內存中儲存值,它只會在程序運行的時候生成值。

>>> mygenerator = (x*x for x in range(3))
>>> for i in mygenerator:
...    print(i)
0
1
4

它和上面的不同僅僅是把`[]替換成()。生成器只能使用一次。

yield

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"條件時,生成器爲空。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章