python生成器

有個需求,把列表[0,1,2,3,4,5,6,7,8,9],要求你把列表裏面的每一個值加1。python

什麼是生成器?算法

 經過列表生成式,咱們能夠直接建立一個列表,可是受到內存的限制,列表容量是有限的,並且建立一個包含100萬個元素的列表,不只佔用很大的存儲空間,若是咱們僅僅須要訪問前面幾個元素,那後面絕大多數元素佔用的空間都浪費了。數組

 因此,若是列表元素能夠按照某種算法推算出來,那咱們是否可用在循環過程當中不斷推算出後續的元素呢?這樣沒必要建立完整的list,從而節省大量的空間,在python中,這種一邊循環一邊計算的機制,成爲生成器generator函數

 生成器是一種特殊程序,可用被用做控制循環的迭代行爲,python中生成器是迭代器的一種,使用yield返回值函數,每次調用yield會暫停,而可用使用next()函數和send()函數恢復生成器。spa

 生成器累死於返回值爲數組的一個函數這個函數可用接收參數,能夠被調用,可是,不一樣於通常的函數會一次性返回包含了全部數值的數組,生成器一次只能產生一個值,這樣消耗的內存數量將大大減小,並且容許調用函數可用很快的處理前幾個返回值,所以生成器看起來像是一個函數,可是表現的卻像是迭代器。內存

 

建立generator有不少種方法,其中一種很簡單,只要把一個列表生成式的[]改爲()便可,就建立了一個generatorgenerator

a=[0,1,2,3,4,5,6,7,8,9]
result=[i+1 for i in a ]
print(result) #列表生成式

generator_ex=(i+1 for i in a )
print(generator_ex) #生成器 <generator object <genexpr> at 0x0000023904A99258>

list和generator_ex的區別是:從表面看是[]和(),但結果卻不同,一個打印出來是列表(由於是列表生成式),而第二個打印出來是
<generator object <genexpr> at 0x0000023904A99258>,若是須要打印出generator—_ex的每個元素,那麼可使用next()函數
#若是要一個個打印出來,能夠經過next()函數得到generator的下一個返回值:
print(next(generator_ex))
print(next(generator_ex))
print(next(generator_ex))
print(next(generator_ex))
print(next(generator_ex))
print(next(generator_ex))
print(next(generator_ex))
print(next(generator_ex))
print(next(generator_ex))
print(next(generator_ex))
相關文章
相關標籤/搜索