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