上一篇
Python生成器send方法教程 - 使用send启动生成器
- Python
- 2025-08-10
- 1884
Python生成器send方法教程
什么是生成器?
Python生成器是一种特殊类型的迭代器,它使用yield
语句而不是return
来返回值。生成器可以暂停和恢复执行,这使得它们非常适合处理大型数据集或无限序列。
send方法的作用
send()
方法允许在生成器暂停时向其发送一个值。这个值会成为当前yield
表达式的结果,然后生成器继续执行直到遇到下一个yield
。
基本用法
下面是一个使用send方法的简单示例:
def simple_generator():
print("生成器开始")
x = yield "第一次暂停"
print(f"接收到值: {x}")
y = yield "第二次暂停"
print(f"接收到值: {y}")
yield "生成器结束"
# 创建生成器
gen = simple_generator()
# 启动生成器(必须使用None或next())
result = next(gen)
print(f"从生成器获取: {result}")
# 使用send发送值
result = gen.send(10)
print(f"从生成器获取: {result}")
# 再次发送值
result = gen.send(20)
print(f"从生成器获取: {result}")
输出结果:
生成器开始
从生成器获取: 第一次暂停
接收到值: 10
从生成器获取: 第二次暂停
接收到值: 20
从生成器获取: 生成器结束
send方法的工作原理
理解send()
方法的工作原理很重要:
- 生成器在
yield
表达式处暂停 send(value)
将值发送到生成器- 该值成为当前
yield
表达式的结果 - 生成器继续执行直到下一个
yield
send()
返回下一个yield
的值
实际应用示例
下面是一个更实用的例子,展示如何使用send方法实现一个简单的协程:
def accumulator():
total = 0
while True:
value = yield total
if value is None:
break
total += value
# 创建累加器
acc = accumulator()
# 启动生成器
next(acc)
# 发送值进行累加
print(acc.send(5)) # 输出: 5
print(acc.send(10)) # 输出: 15
print(acc.send(3)) # 输出: 18
# 结束生成器
try:
acc.send(None)
except StopIteration:
print("累加器结束")
注意事项
- 在生成器刚创建时,必须使用
next()
或send(None)
启动生成器 - 在最后一个
yield
之后调用send()
会引发StopIteration
异常 - 生成器只能接收值,不能发送值 - 使用
yield
返回值 - 确保正确处理生成器的结束状态
总结
send()
方法为Python生成器提供了强大的双向通信能力,使得生成器不仅仅是数据生产者,还可以成为数据消费者。这种特性让生成器非常适合实现协程和各种状态机。
关键点: 使用send方法时,记住必须先使用next()
或send(None)
启动生成器。之后就可以在暂停点向生成器发送数据,实现双向通信。
本文由YuwenJie于2025-08-10发表在吾爱品聚,如有疑问,请联系我们。
本文链接:https://www.521pj.cn/20257776.html
发表评论