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

Python3.x生成器yield表达式与__next__、send方法理解

当一个生成器函数被调用时,它将返回一个名为生成器迭代器。 然后这个生成器将控制生成器函数的执行。 执行过程会在这个生成器的某个方法被调用时开始。 这时,函数会执行到第一个 yield 表达式,在那里它将再次被挂起,向生成器的调用方返回 yield_list 的值,或者如果 yield_list 被省略则返回 None。————Python官方文档-6.2.9. yield 表达式

生成器函数

这是当一个带返回值的普通函数

def test_fun():return 1>>print(test_fun())
1

return换成yield之后, 这个函数就变成了一个生成器函数(不是定义)

def generator_fun():val1 = yield 1val2 = yield 2>>g = generator_fun() // 生成器函数调用时返回生成器
>>print(next(g)) // 控制生成器函数的执行
1
>>print(g.send(None)) // 控制生成器函数的执行
2

该函数被调用的时候并不直接返回yield后面的值,而是返回一个名为生成器的可迭代对象,需要使用内置函数next()或者生成器对象方法send()控制生成器函数本身的执行过程。

注意:

  • yield在函数体中可以有多个,但是函数中的return在同一分支的代码块中只能有一个
  • yield及其“返回值” 组成的整体是一个有值的表达式,被称为yield表达式,表达式的值可以从外面传入(即生成器对象send()传入的值);如果没有从外面传入,则表达式的值为None

生成器函数的开始、暂停和恢复

生成器函数的开始执行

生成器函数开始执行的方式有两种:

  1. 使用next()函数,将生成器作为参数传入:
    该函数底层会调用生成器对象内部的__next__()方法
g = generator_fun() // 生成器函数调用时返回生成器
next(g) // 生成器开始执行
  1. 使用生成器对象的send()方法,参数必须为None
g = generator_fun() // 生成器函数调用时返回生成器
g.send(None) // 生成器开始执行

生成器函数的暂停

生成器执行的特点是:执行流运行至yield时,将yield返回值返回给调用方后,函数执行的状态会被保存,然后函数执行过程被暂停

生成器函数的恢复

生成器执行恢复的方式和开始执行的调用方式相似

  1. 使用next()函数,将生成器作为参数传入:
    该函数底层会调用生成器对象内部的__next__()方法, 生成器从上一次暂停的位置继续向下执行
g = generator_fun() // 生成器函数调用时返回生成器
next(g) // 生成器从上一次暂停的位置继续执行
  1. 使用生成器对象的send()方法,参数可以是指定的值
def generator_fun():val1 = yield 1print("val1 = ", val1)val2 = yield 2print("val2 = ", val2)>>g = test_fun() // 生成器函数调用时返回生成器
>>print(g.send(None)) // 生成器开始执行
1
>>print(g.send(2)) // 生成器继续执行,yield 1的值是传入的2, 因此, val1===2
val1 = 2
2
>>print(g.send(3)) // 生成器继续执行,yield 2的值是传入的3, 因此, val2===3
val2 = 3
StopIteration

使用send(value)传入指定值后,该值会被赋值给yield表达式, 然后复制给表达式左侧的值,最后恢复执行流,继续向下执行,直到yield返回值,或者抛出StopIteration异常。

http://www.gsyq.cn/news/82799.html

相关文章:

  • 严选十大宁波香港留学中介机构排名整合出炉一览 - 留学品牌推荐官
  • AI与网络安全的较量:主动防御时代的策略与实践
  • 开友供应链订货分账系统
  • 2025年年终上海继承纠纷律师推荐:聚焦涉外资产与高净值传承,严选5款处理复杂案例的可靠性解析 - 品牌推荐
  • 2025城市轨道交通专科学校排名TOP5权威推荐,助力轨道人 - 工业品牌热点
  • 大作业笔记-3
  • JVS低代码研发中,如何创建自定义前端页面并接入到现有系统中,从创建到接入的全攻略
  • 经常换色怎么选染发膏?忆丝芸温和染护 + 显色稳定的染发膏选择攻略 - 速递信息
  • Django XML序列化器算法漏洞引发拒绝服务攻击风险
  • 深圳市龙润彩印机械设备有限公司的实力怎样?产品质量可靠不 - 工业推荐榜
  • 2025年年终创始人IP打造公司推荐:基于超百家企业实战案例与多行业适配性的5家高可靠性服务商深度解析 - 十大品牌推荐
  • 2025二氧化碳制冷机大型厂家TOP5权威推荐:深度制冷机厂 - mypinpai
  • linux查询近8小时ssh登录失败的ip转换为hosts.deny格式打印
  • 实用指南:UE5 的 Waterline Pro 6的浮力作用机制解析
  • 2025制冷机品牌TOP5权威推荐:甄选企业助力工业温控升级 - mypinpai
  • Windows下MySQL修改my.ini后无法启动
  • 2025年东莞水磨石地坪服务推荐,水磨石地坪翻新哪家可靠全解 - 工业品牌热点
  • 攻防世界PHP2
  • 2025年NSK轴承实力供应商五大推荐:工业领域靠谱合作伙伴 - mypinpai
  • 2025年中国INA轴承定制服务五大企业推荐:INA轴承品牌 - myqiye
  • 天硕(TOPSSD) 联系方式: 关键领域存储选型建议指导 - 十大品牌推荐
  • 2025年12月固态硬盘品牌推荐:五大品牌深度对比与选购指南 - 品牌推荐
  • 2025年偏心半球阀十大品牌实力排行,谁主沉浮?行业内热门的偏心半球阀制造厂技术领航,品质之选 - 品牌推荐师
  • 2025整车环境模拟试验仓TOP5权威推荐:可信品牌、优质厂 - 工业品牌热点
  • 广州检验检测认证集团有限公司 联系方式:服务选择参考建议 - 品牌推荐
  • 广州检验检测认证集团有限公司 联系方式: 官方信息核实与使用建议 - 品牌推荐
  • 2025年12月铝单板厂家综合实力排行榜单:深度评测对比分析与专业选购决策指南全解析 - 品牌推荐
  • 用 Doris 托底实时明细与聚合Flink CDC Pipeline 的 Doris Sink 实战 - 详解
  • EMC 整改公司哪家好?来看看这份涵盖多家实力企业的推荐清单 - 栗子测评
  • 大夏龙雀DX-WF25 arduino开发平台搭建