news 2026/8/5 8:31:38

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 += 10total=10
③ 回到循环,执行到yield total,暂停
10
3gen.send(20)20赋给value
total += 20total=30
③ 回到循环,执行到yield total,暂停
30
4gen.send(None)value=Nonebreak→ 生成器结束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),不能sendNone的值。

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)来启动生成器。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/5 8:30:23

DLSS Swapper终极指南:5步轻松实现游戏性能自由切换

DLSS Swapper终极指南:5步轻松实现游戏性能自由切换 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper 你是否曾经因为游戏更新后DLSS版本不兼容导致帧率下降而烦恼?是否想要尝试新版本DLSS功能却发…

作者头像 李华
网站建设 2026/8/5 8:29:16

C++: 顺序容器与适配器深度拆解——从内存底层到API江湖

在C STL的偌大江湖里,容器是每个C开发者日夜相伴的"兵器谱"。而顺序容器,便是兵器谱里最朴实也最硬核的"基础兵刃"——它们老老实实按线性顺序排列元素,不搞排序、不玩映射,只专注于"存、取、增、删&quo…

作者头像 李华
网站建设 2026/8/5 8:27:40

Unity资源管理:彻底解决删除不及时问题与性能优化指南

1. 项目概述:Unity中“删除不及时”的幽灵在Unity开发中,尤其是项目迭代到中后期,很多开发者都会遇到一个看似不起眼,实则影响深远的“幽灵”问题——资源删除不及时。这不仅仅是简单地按Delete键后文件还在磁盘上那么简单。它可能…

作者头像 李华
网站建设 2026/8/5 8:20:32

TEMU店群自动化管理系统:DOM透视突破大促弹窗,毫秒级响应

TEMU店群自动化管理系统:DOM透视突破大促弹窗,毫秒级响应 做店群的老板都知道,TEMU的多店防关联管理,是店群运营中最耗人力也最容易出错的环节。 做店群的老板都知道,最怕的就是底层IP和硬件指纹穿帮。一旦平台判定你…

作者头像 李华