ITPub博客

首页 > 应用开发 > Python > Python 生成器的 send 方法

Python 生成器的 send 方法

原创 Python 作者:raptors 时间:2025-11-13 14:58:07 0 删除 编辑

# Python 生成器的 `send` 方法


生成器的 `send` 方法是一个强大的特性,它允许在生成器运行过程中向生成器发送值,从而实现双向通信。


## 基本用法


```python

def my_generator():

    print("启动生成器")

    x = yield "第一次yield"

    print(f"收到发送的值: {x}")

    y = yield "第二次yield"

    print(f"收到发送的值: {y}")

    yield "结束"


gen = my_generator()


# 启动生成器

print(gen.send(None))  # 输出: 第一次yield (必须用None启动)


# 发送值到生成器

print(gen.send(10))    # 输出: 收到发送的值: 10

                       #       第二次yield


# 再次发送值

print(gen.send(20))    # 输出: 收到发送的值: 20

                       #       结束

```


## 关键点


1. **调用**必须使用 `send(None)` 或 `next()` 启动生成器,因为没有yield表达式可以接收值

2. `send(value)` 会恢复生成器执行,并将value作为当前暂停的yield表达式的返回值

3. 生成器会执行直到遇到下一个yield语句

4. `send()` 方法返回的是下一个yield表达式的值


## 实际应用示例


```python

def accumulator():

    total = 0

    while True:

        value = yield total

        if value is None:

            break

        total += value


acc = accumulator()

next(acc)  # 启动生成器

https://zq-mobile.zhaopin.com/moment/73378919

https://zhiq.zhaopin.com/moment/73378919

https://zq.zhaopin.com/moment/73378893

https://zq-mobile.zhaopin.com/moment/73378893

https://zhiq.zhaopin.com/moment/73378893

https://zq.zhaopin.com/moment/73378887

https://zq-mobile.zhaopin.com/moment/73378887

https://zhiq.zhaopin.com/moment/73378887

https://zq.zhaopin.com/moment/73378884

https://zq-mobile.zhaopin.com/moment/73378884

https://zhiq.zhaopin.com/moment/73378884

https://zq.zhaopin.com/moment/73378880

https://zq-mobile.zhaopin.com/moment/73378880

https://zhiq.zhaopin.com/moment/73378880

https://zq.zhaopin.com/moment/73378876

https://zq-mobile.zhaopin.com/moment/73378876

https://zhiq.zhaopin.com/moment/73378876

https://zq.zhaopin.com/moment/73378868

https://zq-mobile.zhaopin.com/moment/73378868



print(acc.send(10))  # 输出: 10

print(acc.send(20))  # 输出: 30

print(acc.send(5))   # 输出: 35

acc.close()          # 关闭生成器

```


## 注意事项


- 在生成器未启动或已结束时调用 `send()` 会抛出 `TypeError`

- `send()` 可以用于实现协程式的编程模式

- 结合 `yield from` 可以构建更复杂的生成器管道


生成器的 `send` 方法为生成器提供了与外部代码交互的能力,使得生成器不仅仅是数据生产者,还可以成为数据处理管道的一部分。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/34366/viewspace-3101293/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2019-09-29

  • 博文量
    20
  • 访问量
    20448