Python中的生成器(Generators)是一種特殊的迭代器,它們?cè)试S你逐個(gè)生成元素,而不是一次性生成一個(gè)完整的列表或集合。這樣做的好處是節(jié)省內(nèi)存,因?yàn)樯善髦粫?huì)在需要時(shí)生成下一個(gè)值,而不是在開(kāi)始前就創(chuàng)建所有值。
生成器的創(chuàng)建
生成器可以通過(guò)兩種方式創(chuàng)建:
使用生成器表達(dá)式:類似于列表推導(dǎo)式,但使用圓括號(hào)而不是方括號(hào)。
使用函數(shù)定義中的yield語(yǔ)句:在函數(shù)中,使用yield語(yǔ)句而不是return語(yǔ)句,可以使函數(shù)成為一個(gè)生成器。
使用yield語(yǔ)句的生成器
使用yield語(yǔ)句定義的生成器函數(shù)會(huì)在每次迭代時(shí)返回下一個(gè)值,并保存函數(shù)的狀態(tài),以便在下一次迭代時(shí)從上次停止的地方繼續(xù)執(zhí)行。
def count_to_n(n): for i in range(n): yield i # 使用生成器 for number in count_to_n(5): print(number)
生成器表達(dá)式
生成器表達(dá)式提供了一種更簡(jiǎn)潔的方式來(lái)創(chuàng)建生成器,它看起來(lái)像是列表推導(dǎo)式,但使用圓括號(hào)。
# 生成器表達(dá)式 squares = (x*x for x in range(5)) # 使用生成器表達(dá)式 for square in squares: print(square)
發(fā)送值到生成器
生成器還支持send()方法,該方法允許你向生成器發(fā)送一個(gè)值,該值將在yield表達(dá)式中被接收。這可以用于生成器之間的通信或基于輸入動(dòng)態(tài)生成值。
def counter(): count = 0 while True: value = yield count if value is not None: print(f"Received: {value}") count += 1 c = counter() next(c) # 初始化生成器 print(c.send(10)) # 發(fā)送值10到生成器,并獲取下一個(gè)yield的值
注意:在第一次使用send()之前,必須先使用next()或send(None)來(lái)啟動(dòng)生成器。
關(guān)閉生成器
使用close()方法可以關(guān)閉生成器,這可以防止進(jìn)一步迭代并釋放生成器使用的資源。
c = counter() next(c) c.close() # 關(guān)閉生成器
Python中的生成器是一種非常強(qiáng)大的工具,提供了一種高效的方式來(lái)生成元素序列,同時(shí)避免了在內(nèi)存中一次性存儲(chǔ)整個(gè)序列的需要。通過(guò)yield語(yǔ)句和生成器表達(dá)式,可以輕松地創(chuàng)建和使用生成器。