在 Python 中,yield 是一个关键字,用于定义生成器函数。生成器函数是一种特殊的迭代器,它可以逐个产生值,而不是一次性将所有值存储在内存中。这对于处理大量数据或无限序列非常有用。
基本概念
- 生成器函数:包含
yield关键字的函数称为生成器函数。 - 生成器对象:当你调用一个生成器函数时,它不会立即执行函数体内的代码,而是返回一个生成器对象。
yield表达式:当生成器函数遇到yield表达式时,它会暂停执行并将表达式的值作为结果返回给调用者。同时,生成器的状态会被保存下来,以便稍后继续执行。
生成器的工作原理
- 启动生成器:首次调用生成器对象的
.send(None)或.next()方法时,生成器开始执行直到遇到第一个yield表达式。 - 暂停和恢复:每次遇到
yield表达式时,生成器暂停执行并将控制权交还给调用者。下次调用.next()或.send(value)时,生成器从上次暂停的地方继续执行。 - 结束生成器:如果生成器函数执行完毕或者遇到
StopIteration异常,则生成器终止。
示例代码
基本生成器示例
def simple_generator():
print("Start of the generator")
yield 1
print("Continuing after first yield")
yield 2
print("Continuing after second yield")
yield 3
print("End of the generator")
# 创建生成器对象
gen = simple_generator()
# 手动遍历生成器
for value in gen:
print(f"Yielded value: {value}")
输出
Start of the generator
Yielded value: 1
Continuing after first yield
Yielded value: 2
Continuing after second yield
Yielded value: 3
End of the generator
使用 send 方法
send 方法不仅可以用作激活生成器的方法,还可以向生成器传递值。生成器可以从 yield 表达式接收这些值。
示例代码
def complex_generator():
received = yield 1
print(f"Received: {received}")
received = yield 2
print(f"Received: {received}")
yield 3
# 创建生成器对象
gen = complex_generator()
# 启动生成器
first_value = gen.send(None)
print(f"First yielded value: {first_value}")
# 发送值给生成器
second_value = gen.send('First message')
print(f"Second yielded value: {second_value}")
# 再次发送值给生成器
third_value = gen.send('Second message')
print(f"Third yielded value: {third_value}")
输出
First yielded value: 1
Received: First message
Second yielded value: 2
Received: Second message
Third yielded value: 3
总结
yield:暂停生成器并返回一个值。.send(None):启动生成器。.send(value):向生成器发送一个值,并恢复生成器的执行。
通过这些机制,生成器能够高效地处理大量数据或无限序列,同时保持较低的内存占用。希望这些解释和示例对你有所帮助!如果有更多问题,请随时提问。
889

被折叠的 条评论
为什么被折叠?



