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