新聞中心
生成器是Python中一種特殊的迭代器,它可以在函數(shù)中使用yield關(guān)鍵字來(lái)返回一個(gè)值,并在下一次調(diào)用時(shí)從上次返回的位置繼續(xù)執(zhí)行,生成器可以用于實(shí)現(xiàn)惰性求值、節(jié)省內(nèi)存等場(chǎng)景,本篇回答將詳細(xì)介紹如何使用Python生成器。

生成器的基本概念
1、生成器與普通函數(shù)的區(qū)別:普通函數(shù)在調(diào)用時(shí)會(huì)立即執(zhí)行并返回結(jié)果,而生成器在調(diào)用時(shí)不會(huì)立即執(zhí)行,而是返回一個(gè)生成器對(duì)象,當(dāng)需要獲取下一個(gè)值時(shí),才會(huì)執(zhí)行生成器函數(shù)。
2、生成器的使用場(chǎng)景:惰性求值、節(jié)省內(nèi)存、實(shí)現(xiàn)迭代器等。
生成器的創(chuàng)建方法
1、使用yield關(guān)鍵字:在函數(shù)中使用yield關(guān)鍵字,可以將函數(shù)轉(zhuǎn)換為生成器,當(dāng)函數(shù)被調(diào)用時(shí),不會(huì)立即執(zhí)行,而是返回一個(gè)生成器對(duì)象,當(dāng)需要獲取下一個(gè)值時(shí),才會(huì)執(zhí)行函數(shù)。
def generator_example():
yield 1
yield 2
yield 3
gen = generator_example()
print(next(gen)) # 輸出:1
print(next(gen)) # 輸出:2
print(next(gen)) # 輸出:3
2、使用列表推導(dǎo)式:將列表推導(dǎo)式放在圓括號(hào)內(nèi),可以創(chuàng)建一個(gè)生成器。
generator_example = (x for x in range(1, 4)) print(next(generator_example)) # 輸出:1 print(next(generator_example)) # 輸出:2 print(next(generator_example)) # 輸出:3
3、使用內(nèi)置函數(shù):Python提供了一些內(nèi)置函數(shù),如iter()和range(),可以用于創(chuàng)建生成器。
gen = iter(range(1, 4)) print(next(gen)) # 輸出:1 print(next(gen)) # 輸出:2 print(next(gen)) # 輸出:3
生成器的常用操作
1、next()函數(shù):用于獲取生成器的下一個(gè)值,如果生成器沒(méi)有下一個(gè)值,會(huì)拋出StopIteration異常,可以使用tryexcept語(yǔ)句捕獲異常。
gen = iter(range(1, 4))
try:
print(next(gen)) # 輸出:1
print(next(gen)) # 輸出:2
print(next(gen)) # 輸出:3
except StopIteration:
print("沒(méi)有更多元素")
2、for循環(huán):可以直接使用for循環(huán)遍歷生成器的所有元素,當(dāng)循環(huán)結(jié)束時(shí),會(huì)自動(dòng)拋出StopIteration異常,不需要使用tryexcept語(yǔ)句捕獲異常。
gen = iter(range(1, 4))
for x in gen:
print(x) # 輸出:1, 2, 3
3、zip()函數(shù):可以將多個(gè)生成器的元素按照順序組合成一個(gè)新的生成器,要求各個(gè)生成器的長(zhǎng)度相同。
gen1 = iter([1, 2, 3])
gen2 = iter(['a', 'b', 'c'])
zip_gen = zip(gen1, gen2)
for x, y in zip_gen:
print(x, y) # 輸出:1 a, 2 b, 3 c
生成器的進(jìn)階應(yīng)用
1、帶參數(shù)的生成器:可以在生成器函數(shù)中添加參數(shù),通過(guò)yield關(guān)鍵字返回帶有參數(shù)的值,在調(diào)用生成器時(shí),需要傳入相應(yīng)的參數(shù)。
def generator_with_params(param):
for x in range(param):
yield x * x
gen = generator_with_params(3)
for x in gen:
print(x) # 輸出:0, 1, 4(即0*0, 1*1, 2*2)
2、生成器的鏈?zhǔn)秸{(diào)用:可以通過(guò)yield from關(guān)鍵字將一個(gè)生成器的部分或全部元素傳遞給另一個(gè)生成器,這樣可以實(shí)現(xiàn)生成器的鏈?zhǔn)秸{(diào)用,注意:yield from關(guān)鍵字只能在生成器函數(shù)中使用。
def generator_chain():
yield from range(1, 4)
yield from "abc"
return "結(jié)束"
gen = generator_chain()
for x in gen:
print(x) # 輸出:1, 2, 3, a, b, c, "結(jié)束"(即range和字符串的元素依次輸出)
歸納
本篇回答詳細(xì)介紹了Python生成器的基本概念、創(chuàng)建方法、常用操作以及進(jìn)階應(yīng)用,通過(guò)學(xué)習(xí)本篇內(nèi)容,你應(yīng)該已經(jīng)掌握了如何使用Python生成器來(lái)實(shí)現(xiàn)惰性求值、節(jié)省內(nèi)存等場(chǎng)景,希望對(duì)你有所幫助!
分享標(biāo)題:python生成器如何實(shí)現(xiàn)
當(dāng)前路徑:http://m.fisionsoft.com.cn/article/dpihhgi.html


咨詢
建站咨詢
