0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

通过例子由浅入深的理解yield协程

冬至配饺子 来源:缪斯之子 作者:肖新苗 2022-08-23 11:12 次阅读

题记

本系列目标是通过例子由浅入深的理解协程.

读者

需要有一定的python基础, 概念部分建议阅读经典书: 流畅的python 或者 查看w3c school 或者 菜鸟教程

基本概念

生成器:只要 Python 函数的定义体中有 yield 关键字,该函数就是生成器函数,调用生成器函数返回的是生成器对象

yield关键字:总的来说就是:产出和让步,产出结果,让出控制权

send:send() 方法致使协程前进到下一个yield 语句,另外,生成器可以作为协程使用

例子说明

yield的执行流程, 并制作了一个生成器调用的共同方法print_value

def yield1():
'''
整体解释:1将作为第一个send方法的返回值,b是第二个send方法的参数
最后的return是作为最后一个send方法的返回值
'''
# 4.yield1()协程:阻塞在此,执行yield产出结果为1,把控制权给主线程
# 9.yield1()协程:阻塞解除,获得输入值2,并赋值给b
b = yield 1
# 10.yield1()协程:返回b
return b


def yield2():
'''
协程阻塞在此,执行yield产出结果为None,并交出控制权给主线程
注: 因为yield后面没有值,所以是None
'''
yield
# 如果没有返回值,会return None
pass


def yield3():
yield 1


def print_value(f, args):

try:
# 3.print_value方法:对yield1()协程执行send
# 5.print_value方法:接收yield1()协程的返回值1,并赋值给b
# 8.print_value方法:对yield1()协程再次执行send,并传入2
b = f.send(args)
except StopIteration as e:
'''
11.print_value方法:接收yield1()协程的返回值,
如果是最后一个迭代,就会进入到这个异常捕获
'''

print(f'{f.__name__}返回值 {e.value}')
return e.value
else:
# 6.print_value方法:打印b
print(f'{f.__name__}接收 {b}')

'''

1.主线程:`yield1`是生成器函数,`yield1()`调用生成器函数,

返回生成器对象也可以称作协程
'''
ys = [yield1(), yield2(), yield3()]
for y in ys:
# 2.主线程:y是yield1()生成器对象,第一次发送None
# 12.主线程:y是yield2()生成器对象,第一次发送None.
# 注:yield2 yield3根yield1差不多所以12步以后的都略过了
print_value(y, None)
# 7.主线程:第二次send参数为2
print_value(y, 2)


结果:
yield1接收 1
yield1返回值 2
yield2接收 None
yield2返回值 None
yield3接收 1
yield3返回值 None


审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 生成器
    +关注

    关注

    7

    文章

    321

    浏览量

    21228
  • python
    +关注

    关注

    56

    文章

    4812

    浏览量

    85173
收藏 人收藏

    相关推荐

    长安凯加速发展,推进股权融资与IPO上市

    长安汽车在近期互动平台上透露,其商用车业务的重要承载者——长安凯,正积极把握商用车新能源和智能化变革的机遇,充分利用长安汽车乘用车产业资源,全力推进“12363”发展规划。 长安凯通过构建数
    的头像 发表于 01-10 11:31 748次阅读

    通过高新技术企业复审

    2024年12月11日,广东省全国高新技术企业认定备案公示,广州万通信息技术有限公司通过2024年全国高新技术企业认定报备复审。 万通是国家级专精特新重点“小巨人”企业、是“广东省信息安全芯片
    的头像 发表于 12-13 09:53 465次阅读

    FS-MCore-F800E STM32例

    FS-MCore-F800E STM32例
    发表于 11-18 15:10 0次下载

    使用TMS320C6416处理器:Turbo处理器(TCP)

    电子发烧友网站提供《使用TMS320C6416处理器:Turbo处理器(TCP).pdf》资料免费下载
    发表于 10-23 10:16 0次下载
    使用TMS320C6416<b class='flag-5'>协</b>处理器:Turbo<b class='flag-5'>协</b>处理器(TCP)

    使用TMS320C6416处理器:Viterbi处理器(VCP)

    电子发烧友网站提供《使用TMS320C6416处理器:Viterbi处理器(VCP).pdf》资料免费下载
    发表于 10-21 09:36 0次下载
    使用TMS320C6416<b class='flag-5'>协</b>处理器:Viterbi<b class='flag-5'>协</b>处理器(VCP)

    安达发|APS高级排高级物料需求计划

    APS高级排高级物料需求计划是在制造业中非常重要的概念。它们分别涉及到生产计划和物料管理,对于提高生产效率、降低成本和满足客户需求具有重要意义。下面我将详细介绍这两个概念及其在实际生产
    的头像 发表于 09-25 17:49 405次阅读
    安达发|APS高级排<b class='flag-5'>程</b>高级物料需求计划

    AI视角下的ZR机械手市场:速精密科技独占鳌头

    AI视角下的ZR机械手市场:速精密科技独占鳌头 在智能制造的浪潮中,AI技术以其独特的数据分析能力和市场洞察力,成为评估行业格局的重要工具。近期,通过AI的深度分析,国内ZR机械手市场的竞争格局
    的头像 发表于 09-25 16:14 377次阅读

    基于APS排系统的PDM功能

    APS系统(AdvancedPlanningandScheduling,先进计划与排)是一种基于APS系统(AdvancedPlanningandScheduling,先进计划与排)是一种
    的头像 发表于 09-21 16:53 367次阅读
    基于APS排<b class='flag-5'>程</b>系统的PDM功能

    国内APS高级排软件的全面解析

    在现代制造业和物流行业中,高效的生产计划和库存管理是企业提升竞争力的关键。随着信息技术的发展,高级排软件(AdvancedPlanningandScheduling,APS)成为了企业优化资源配置
    的头像 发表于 09-21 16:49 566次阅读
    国内APS高级排<b class='flag-5'>程</b>软件的全面解析

    晶泰科技与鑫集团签署战略合作协议

    近日,在苏州鑫能源中心,晶泰科技与鑫集团共同见证了双方战略合作新篇章的开启,正式签署了为期五年的战略合作协议。此次合作,不仅标志着两大行业巨头的强强联合,更预示着新能源材料研发领域将迎来一场由人工智能与自动化技术引领的深刻变革。
    的头像 发表于 09-03 14:34 562次阅读

    PGA308标定输出范围0.5v-4.5v满输出会漂移,为什么?

    PGA308标定输出范围0.5v-4.5v 满输出会漂移 (漂移范围正负20mv) 供电:5V 参考:4.096V 输入:0-130mv 输出:0.5-4.5v(满有漂移) 已测量外围电路电压都是稳定状态 请教出现满
    发表于 08-29 06:03

    求CS32A039例

    求CS32A039例,邮箱:448789893@qq.com
    发表于 07-31 16:54

    工业软件APS排系统简介

    APS是指AdvancedPlanningandScheduling,是一种工业软件,用于制造业中的排系统。它的作用是将制造计划转化为可执行的生产计划,以确保生产流程的高效性和优化。APS的功能
    的头像 发表于 06-26 17:58 3039次阅读
    工业软件APS排<b class='flag-5'>程</b>系统简介

    请问ESP32s3 ULP RISC-V处理器是否支持ADC的读取?

    我在ULP RISC-V处理器的例程中,没有发现有对ADC的操作,请问RISC-V处理器目前还不支持吗?使用的IDF版本为4.4.2。 我想在ULP模式下,通过ADC来读取外部器件的数据。
    发表于 06-14 07:38

    使用C语言实现的CRC计算单元的例子

    使用C语言实现的CRC计算单元的例子
    的头像 发表于 05-16 16:16 1138次阅读