Python 中的 yield
关键字用于定义一个生成器(generator)。生成器是一种特殊的迭代器,它允许你逐个产生值,而不是一次性创建并返回一个包含所有值的列表。使用 yield
的函数被称为生成器函数,它们在执行时不会直接返回值,而是在每次迭代时返回一个值。
基本生成器函数
def my_generator():
yield 1
yield 2
yield 3
使用生成器函数时,你可以这样做:
gen = my_generator()
print(next(gen)) # 输出: 1
print(next(gen)) # 输出: 2
print(next(gen)) # 输出: 3
迭代生成器
生成器可以直接用于 for
循环:
for value in my_generator():
print(value)
使用 yield
进行复杂的迭代
yield
不仅可以用于简单的值返回,还可以用于复杂的迭代逻辑,包括多层嵌套循环。
def power_two(max):
for number in range(1, max + 1):
yield number * 2
for power in power_two(5):
print(power)
发送值到生成器
生成器函数可以通过 send()
方法接收值。这允许在生成器的执行过程中进行更复杂的交互。
def echo():
while True:
print("输出值前")
value = yield
print(f"收到值: {
value}")
gen = echo()
next(gen) # 初始化生成器,进入循环
gen.send(42) # 输出: 收到值: 42
gen.send(10) # 输出: 收到值: 10
使用 yield from
yield from
允许你在生成器中委托给另一个生成器或迭代器,这有助于简化代码并避免多层嵌套。
def leaf():
yield '叶'
yield '子'
def branch():
yield '枝'
yield from leaf()
yield '条'
for item in branch():
print(item)
异常处理
生成器也支持 try
…except
…finally
语句,用于处理可能出现的异常。
def simple_generator():
try:
yield 1
yield 2
except ValueError as e:
yield str(e)
finally:
yield '完成'
for value in simple_generator():
print(value)
生成器的 __iter__
和 __next__
方法
生成器默认实现了 __iter__
和 __next__
方法,这使得它们可以被用作迭代器。
gen = my_generator()
print(gen.__next__()) # 输出: 1
print(gen.__next__()) # 输出: 2
print(gen.__next__()) # 输出: 3
结论
yield
关键字在Python中提供了一种优雅的方式来创建生成器,它们是实现迭代协议的强大工具。生成器在内存使用上非常高效,因为它们不需要一次性存储所有值,而是按需产生值。这使得生成器非常适合处理大数据集或无限序列。