一個普通的函數(shù)調(diào)用一般是這樣的,從第一行代碼開始執(zhí)行,直到最后一行代碼結(jié)束(中間有可能會遇到return,異常等會提前結(jié)束)。對于我們而言,這是一個再正常不過的函數(shù)標(biāo)準(zhǔn)執(zhí)行流程,它只能返回一個至或者隱式的返回None。不過,有時可以創(chuàng)建能產(chǎn)生一個序列的函數(shù)還是有幫助的。例如,通過列表生成式,我們可以直接創(chuàng)建一個列表。但是,受到內(nèi)存限制,列表容量肯定是有限的。而且,創(chuàng)建一個包含100萬個元素的列表,不僅占用很大的存儲空間,如果我們僅僅需要訪問前面幾個元素,那后面絕大多數(shù)元素占用的空間都白白浪費了。所以,如果列表元素可以按照某種算法推算出來,那我們是否可以在循環(huán)的過程中不斷推算出后續(xù)的元素呢?這樣就不必創(chuàng)建完整的list,從而節(jié)省大量的空間。在Python中,擁有這種能力的“函數(shù)”被稱為生成器(generator )
- 創(chuàng)建生成器
只要把一個列表生成式的[]改成(),就創(chuàng)建了一個generator
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x1022ef630>
-
任何包含yield語句的函數(shù)
def flatten(nested): for sublist in nested: for element in sublist yield element
這篇主要簡單介紹了下生成器以及怎么創(chuàng)建生成器的兩種方法,接下來的系列會讓大家對生成器有更深的了解以及它的作用。