Python中的yield是什麼意思
- 2019 年 10 月 6 日
- 筆記
要理解yield,先理解幾個概念
可迭代的(Iterables)
從list中挨個讀取item稱為迭代, 如下例所示。
>>> mylist = [1, 2, 3] >>> for i in mylist: ... print(i) 1 2 3
mylist是可迭代的。再來個複雜一點的例子
>>> mylist = [x*x for x in range(3)] >>> for i in mylist: ... print(i) 0 1 4
生成器(Generators)
生成器是一個迭代子,但是只能迭代一次。因為它們不把數值存儲在記憶體中,而是即時生成它們。
>>> mygenerator = (x*x for x in range(3)) >>> for i in mygenerator: ... print(i) 0 1 4
與上面的差別是生成器用了(),而不是[]。 不過for循環只能執行一次。執行完之後,mygenerator裡面的值就變空了。
Yield
yield關鍵字很像return,所不同的是,它返回的是一個生成器。
>>> def createGenerator(): ... mylist = range(3) ... for i in mylist: ... yield i*i*i ... >>> mygenerator = createGenerator() # 創建一個generator >>> print(mygenerator) # mygenerator 是一個對象 <generator object createGenerator at 0xb7555c34> >>> for i in mygenerator: ... print(i) 0 1 8
當你調用這個函數的時候,函數內容並沒有執行,而是返回一個生成器對象。然後,你再用for去遍歷這個生成器。
