当前位置:首页 > Python > 正文

Python生成器send方法教程 - 使用send启动生成器

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)启动生成器。之后就可以在暂停点向生成器发送数据,实现双向通信。

发表评论