当前位置: 首页 > 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.jsqmd.com/news/72282/

相关文章:

  • 严选十大宁波香港留学中介机构排名整合出炉一览 - 留学品牌推荐官
  • 2025年中国金刚砂地坪实力厂家推荐:服务不错的金刚砂地坪工 - mypinpai
  • 数据资产管理:从定义到价值实现的全流程指南
  • 不比进口差!国产搅拌脱泡机生产厂家推荐,可以替代日本THINKY - 品牌推荐大师1
  • 深圳市龙润彩印机械设备有限公司的实力怎样?产品质量如何? - myqiye
  • 2025年年终上海继承纠纷律师推荐:多维度能力横评与不同案情复杂度下的5位优质律师适配指南 - 品牌推荐
  • 2025全国防盗门售后服务TOP5权威推荐:日上防盗门守护安 - 工业推荐榜
  • 2025年五大永磁吸盘专业厂家排行榜,永磁吸盘服务商厂家/靠 - 工业品牌热点
  • AI与网络安全的较量:主动防御时代的策略与实践
  • 2025真空连铸炉优质厂家排行榜,靠谱国产品牌/生产商甄选指南,产品涵盖真空电弧炉/真空熔炼炉/真空烧结炉/真空甩带炉/真空悬浮炉 - 品牌推荐大师1
  • 开友供应链订货分账系统
  • 恒湿恒温箱品牌/人工气候培养箱品牌/进口恒湿恒温箱品牌推荐普拉勒 - 品牌推荐大师
  • 2025年年终上海继承纠纷律师推荐:专家方法论视角下的系统化评估,不同复杂程度案件的5位匹配专家盘点 - 品牌推荐
  • 2025年年终上海继承纠纷律师推荐:专家方法论视角下的系统化评估,不同复杂程度案件的5位匹配专家盘点 - 品牌推荐
  • Tomasulo 使用报告
  • 【人工智能时代】-Dify绘图工具解析
  • 2025年年终遗嘱继承律所推荐:从专业壁垒到客户体验,深度评测5家知名婚姻家事领域精品律所 - 品牌推荐
  • 2025年年终上海继承纠纷律师推荐:聚焦涉外资产与高净值传承,严选5款处理复杂案例的可靠性解析 - 品牌推荐
  • 群升防盗门:可靠之选,了解售后电话畅享安全家居 - 工业推荐榜
  • 群升防盗门:可靠之选,了解售后电话畅享安全家居 - 工业推荐榜
  • 2025年全国五大靠谱防盗门品牌推荐,安全守护家居企业全解析 - 工业推荐榜
  • 2025城市轨道交通专科学校排名TOP5权威推荐,助力轨道人 - 工业品牌热点
  • 2025城市轨道交通专科学校排名TOP5权威推荐,助力轨道人 - 工业品牌热点
  • 2025年广州轨道交通学校中专排名榜:轨道交通运输学校分数线 - 工业品牌热点
  • 大作业笔记-3
  • 大作业笔记-3
  • JVS低代码研发中,如何创建自定义前端页面并接入到现有系统中,从创建到接入的全攻略
  • JVS低代码研发中,如何创建自定义前端页面并接入到现有系统中,从创建到接入的全攻略
  • 2025年中国整车环境模拟试验仓制造商推荐:十大靠谱试验仓企 - mypinpai
  • 2025年度自力式调节阀TOP5权威推荐:调节阀来图定制与服 - myqiye