一分鐘了解Python生成器
什么是生成器
當(dāng)我們討論生成器的時(shí)間一般會(huì)涉及兩個(gè)方面
生成器函數(shù) :生成器函數(shù)類(lèi)似正常的函數(shù),但是當(dāng)它需要返回值的時(shí)候使用 yield 來(lái)代替 return。如果一個(gè)函數(shù)包含 yield,那么就可以說(shuō)這個(gè)函數(shù)是生成器函數(shù)。
def gen_fun():
??yield 'a'
??yield 'b'
for item in gen_fun():
??print(item)
執(zhí)行以上代碼,輸出:
a
b
生成器對(duì)象 :生成器函數(shù)返回的就是生成器對(duì)象,通過(guò)調(diào)用生成器對(duì)象的 next() 方法(Python3 為 __next__() 或內(nèi)置的 next 函數(shù))或 for in 語(yǔ)法來(lái)使用生成器對(duì)象。
def gen_func():
??yield 'a'
??yield 'b'
# 這里的 g 就是一個(gè)生成器對(duì)象
g = gen_func()
# 通過(guò) for in 來(lái)去除生成的數(shù)據(jù)
for item in g:
??print(item)
執(zhí)行以上代碼,輸出:
a
b
生成器有什么特點(diǎn)
同樣是可以用 for in 來(lái)遍歷對(duì)比直接返回 ['a', 'b'] 的正常函數(shù),它具有以下特殊之處:
它并沒(méi)有把所有生成的值存在內(nèi)存中,而是在運(yùn)行時(shí)生成值。
它返回的生成器對(duì)象僅可遍歷一次,例如上述例子中再次使用 for item in g 遍歷時(shí)會(huì)發(fā)現(xiàn)什么沒(méi)輸出。
生成器的應(yīng)用場(chǎng)景
生成器運(yùn)行時(shí)生成值時(shí)的特性可以避免一次性創(chuàng)建大量的對(duì)象占有過(guò)多的內(nèi)存,它能夠讓你在許多情況下以一種優(yōu)雅而又更低內(nèi)存消耗的方式簡(jiǎn)化 無(wú)限 序列相關(guān)的操作。實(shí)際場(chǎng)景中當(dāng)需要大量生成數(shù)據(jù)的時(shí)候都是考慮讓生成器登場(chǎng)的時(shí)候。
以下是一個(gè)經(jīng)典的實(shí)現(xiàn)斐波那契數(shù)列生成器的例子:
def fib(n):
??a, b = 0, 1
??for item in range(n):
????yield b
????a, b = b, a + b
for item in fib(5):
??print(item)
執(zhí)行以上代碼,輸出:
1
1
2
3
5
聲明:文章來(lái)源于網(wǎng)絡(luò),如有侵權(quán)請(qǐng)聯(lián)系刪除!