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

    文章

    313

    浏览量

    20871
  • python
    +关注

    关注

    53

    文章

    4754

    浏览量

    84157
收藏 人收藏

    评论

    相关推荐

    谈谈的那些事儿

    随着异步编程的发展以及各种并发框架的普及,作为一种异步编程规范在各类语言中地位逐步提高。我们不单单会在自己的程序中使用,各类框架如fastapi,aiohttp等也都是基于异步
    的头像 发表于 01-26 11:36 1036次阅读
    谈谈<b class='flag-5'>协</b><b class='flag-5'>程</b>的那些事儿

    如何通过仿真动图理解各种传感器的原理呢?

    如何通过仿真动图理解各种传感器的原理呢?
    发表于 01-15 10:39 416次阅读
    如何<b class='flag-5'>通过</b>仿真动图<b class='flag-5'>理解</b>各种传感器的原理呢?

    for循环的基本例子

    for循环是一种常见的循环结构,用于重复执行一段代码。它通常由三个部分组成:循环变量的初始化、循环条件和循环变量更新。下面将通过详细的例子来解释for循环的用法和工作原理。 首先,我们来考虑一个简单
    的头像 发表于 11-22 10:00 1813次阅读

    python最简单for循环例子

    Python是一种简单而又强大的编程语言,通过其清晰的语法和丰富的功能库,我们可以实现各种各样的任务。其中一个最基本的语法结构就是for循环,让我们来看一下如何使用for循环来编写一个最简单的例子
    的头像 发表于 11-21 14:53 807次阅读

    何选择一个合适的来获得CPU执行权

    如今虽不敢说已经是红的发紫,但确实是越来越受到了大家的重视。Golang中的已经是只有goroutine,以至于很多go程序员是只知有,不知有线程了。就连C++也在最新的C++
    的头像 发表于 11-13 14:10 330次阅读
    何选择一个合适的<b class='flag-5'>协</b><b class='flag-5'>程</b>来获得CPU执行权

    Linux线程、线程与异步编程、与异步介绍

    不是系统级线程,很多时候被称为“轻量级线程”、“微线程”、“纤(fiber)”等。简单来说可以认为
    的头像 发表于 11-11 11:35 875次阅读
    Linux线程、线程与异步编程、<b class='flag-5'>协</b><b class='flag-5'>程</b>与异步介绍

    的实现与原理

    前言 这个概念很久了,好多程序员是实现过这个组件的,网上关于的文章,博客,论坛都是汗牛充栋,在知乎,github上面也有很多大牛写了关于
    的头像 发表于 11-10 10:57 364次阅读

    C/C++编程的相关概念和技巧

    一、引言 的定义和背景 (Coroutine),又称为微线程或者轻量级线程,是一种用户态的、可在单个线程中并发执行的程序组件。
    的头像 发表于 11-09 11:34 560次阅读

    C++20无栈超轻量高性能异步库开发实战

    c++20出来有一段时间了。其中一大功能就是终于支持了(c++作为行业大哥大级别的语言,居然到C++20才开始支持,我也是无力吐槽了,让多少人等了多少年,等了多少青春)但千呼万
    的头像 发表于 11-09 10:20 1000次阅读

    的作用、结构及原理

    本文介绍了的作用、结构、原理,并使用C++和汇编实现了64位系统下的池。文章内容避免了
    的头像 发表于 11-08 16:39 985次阅读
    <b class='flag-5'>协</b><b class='flag-5'>程</b>的作用、结构及原理

    怎么理解电容通交流隔直流

    做硬件的都知道,电容通交流,隔直流;那么这个怎么简单理解?我们来举个例子?如下图所示:电路接好后,我们来做个实验。
    的头像 发表于 11-05 17:40 1826次阅读
    怎么<b class='flag-5'>理解</b>电容通交流隔直流

    Python yield的作用

    理解yield的作用,你必须理解生成器是什么。在理解生成器之前,必须先理解迭代器。 迭代器 当您创建一个列表时,你可以逐个读取它的项。逐项
    的头像 发表于 11-02 11:21 348次阅读
    Python <b class='flag-5'>yield</b>的作用

    一文详解CP15处理器

    ARM架构通过支持处理器来扩展处理器的功能。ARM架构的处理器支持最多16个处理器,通常称为CP0~CP15。下述的处理器被ARM用于特殊用途。
    发表于 10-31 16:07 1700次阅读
    一文详解CP15<b class='flag-5'>协</b>处理器

    如何学会 Python yield 关键词

    理解yield的作用,你必须理解生成器是什么。在理解生成器之前,必须先理解迭代器。 1.迭代器 当您创建一个列表时,你可以逐个读取它的项。
    的头像 发表于 10-31 11:06 267次阅读
    如何学会 Python <b class='flag-5'>yield</b> 关键词

    什么是?如何彻底理解

    我们先来看一个普通的函数,这个函数非常简单
    的头像 发表于 10-08 09:58 1512次阅读
    什么是<b class='flag-5'>协</b><b class='flag-5'>程</b>?如何彻底<b class='flag-5'>理解</b><b class='flag-5'>协</b><b class='flag-5'>程</b>?