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 totaltotal0暂停02gen.send(10)①10赋给value②total 10→total10③ 回到循环执行到yield total暂停103gen.send(20)①20赋给value②total 20→total30③ 回到循环执行到yield total暂停304gen.send(None)valueNone→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: cant 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)来启动生成器。