云計算開發(fā)學(xué)習(xí)筆記:Python3 什么情況下需要使用 yield?
一個函數(shù) f,f 返回一個 list,這個 list 是動態(tài)計算出來的(不管是數(shù)學(xué)上的計算還是邏輯上的讀取格式化),并且這個 list 會很大(無論是固定很大還是隨著輸入?yún)?shù)的增大而增大),這個時候,我們希望每次調(diào)用這個函數(shù)并使用迭代器進(jìn)行循環(huán)的時候一個一個的得到每個 list 元素而不是直接得到一個完整的 list 來節(jié)省內(nèi)存,這個時候 yield 就很有用。
以斐波那契函數(shù)為例,我們一般希望從 n 返回一個 n 個數(shù)的 list:
上面那個 fab 函數(shù)從參數(shù) max 返回一個有 max 個元素的 list,當(dāng)這個 max 很大的時候,會非常的占用內(nèi)存。
一般我們使用的時候都是這個樣子的,比如:
這樣我們實(shí)際上是先生成了一個 1000 個元素的 list:f,然后我們再去使用這個 f。
現(xiàn)在,我們換一個方法:
因?yàn)槲覀儗?shí)際使用的是 list 的遍歷,也就是 list 的迭代器。那么我們可以讓這個函數(shù) fab 每次只返回一個迭代器—;—;一個計算結(jié)果,而不是一個完整的 list:
這樣,我們每次調(diào)用fab函數(shù),比如這樣:
或者 next 函數(shù)之類的,實(shí)際上的運(yùn)行方式是每次的調(diào)用都在 yield 處中斷并返回一個結(jié)果,然后再次調(diào)用的時候再恢復(fù)中斷繼續(xù)運(yùn)行。