Python 生成器方法 send() 的执行过程

send() 是生成器的一个特殊方法,它不仅能恢复生成器的执行,还能向生成器发送一个值,这个值会成为当前 yield 表达式的返回值。

一、send() 的核心作用

方法作用能否传值
next(g)恢复执行到下一个 yield不能
g.send(value)恢复执行,并传入一个值

说明send(value) 传入的值会赋值给当前 yield 表达式

def demo():
    x = yield 1      # yield 1 返回给外部,同时接收外部 send 的值
    print(f"收到: {x}")
    y = yield 2
    print(f"收到: {y}")
    yield 3

g = demo()
print(next(g))       # 1(执行到第一个 yield,暂停)
print(g.send(100))   # 100 赋给 x → 打印"收到: 100" → 执行到 yield 2 → 返回 2
print(g.send(200))   # 200 赋给 y → 打印"收到: 200" → 执行到 yield 3 → 返回 3

二、执行过程

代码示例

def accumulator():
    total = 0
    while True:
        value = yield total  # ① 返回当前 total,等待接收值
        if value is None:
            break
        total += value

gen = accumulator()

逐步执行

步骤代码执行过程返回值
1next(gen)执行到 yield totaltotal=0,暂停0
2gen.send(10)① 10 赋给 value
② total += 10 → total=10
③ 回到循环,执行到 yield total,暂停
10
3gen.send(20)① 20 赋给 value
② total += 20 → total=30
③ 回到循环,执行到 yield total,暂停
30
4gen.send(None)value=None → break → 生成器结束StopIteration

三、send() 和 next() 的等价关系

next(g)          # 等价于 g.send(None)

实际上,next(g) 内部调用的就是 g.send(None)

def gen():
    yield 1
    yield 2

g = gen()
print(next(g))     # 1
print(g.send(None))  # 2(等价于 next(g))

四、第一次调用不能用 send()

规则:生成器第一次恢复执行时,必须用 next(g) 或 g.send(None),不能 send 非 None 的值。

def gen():
    x = yield 1
    print(x)

g = gen()
# g.send(100)  # TypeError: can't send non-None value to a just-started generator
next(g)          # 必须先启动
g.send(100)      # 之后可以 send

原因:生成器在第一次执行前没有 yield 表达式来接收值。

五、send() 的执行流程图

   send(value) 把 value 传给当前暂停的 yield 表达式,yield 表达式的返回值就是 send 传入的值。第一次调用必须用 next(g) 或 send(None) 来启动生成器。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值