题记
本系列目标是通过例子由浅入深的理解协程.
读者
需要有一定的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文章
315浏览量
21010 -
python
+关注
关注
56文章
4797浏览量
84685
发布评论请先 登录
相关推荐
评论