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

描述

题记

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

读者

需要有一定的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


审核编辑:刘清

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分