首先在理解yield關鍵字之前,我們要學習一下關於迭代、迭代器和生成器的前置知識:
而yield就是用來構成生成器的一個關鍵字
首先討論一下,通過列表生成式,我們可以直接創建一個列表。但是,受到內存限制,列表容量肯定是有限的。而且,創建一個包含100萬個元素的列表,不僅佔用很大的存儲空間,如果我們僅僅需要訪問前面幾個元素,那後面絕大多數元素佔用的空間都白白浪費了。
舉個例子,給出一個題目,讓你給出斐波那契數列的第一百項,如果使用列表生成式,那麼我們需要創建一個百萬級的列表來進行儲存,空間複雜度奇大,顯然是不可以被接受的。
所以,如果列表元素可以按照某種算法推算出來,那我們是否可以在循環的過程中不斷推算出後續的元素呢?這樣就不必創建完整的list,從而節省大量的空間。在Python中,這種一邊循環一邊計算的機制,稱爲生成器:generator。
而yield的用處呢,就是將你定義的函數變爲一個生成器,即其返回的值是一個生成器對象,下面給一個簡單的例子
def yield_test(n):
for i in range(n):
yield call(i)
print("i=",i)
#做一些其它的事情
print("do something.")
print("end.")
def call(i):
return i*2
#使用for循環
for i in yield_test(5):
print(i,",")
0 ,
i= 0
2 ,
i= 1
4 ,
i= 2
6 ,
i= 3
8 ,
i= 4
do something.
end.
大致如此,通過使用yield構成的生成器,我們可以對代碼進行優化