美文网首页
python从yield到asyncio<第一章>

python从yield到asyncio<第一章>

作者: lpj24 | 来源:发表于2017-09-25 11:08 被阅读221次

1.生成器, python函数中包含有yield关键字的函数可以理解为生成器, 可以用于惰性加载
2.协程, 调用方可以与生成器函数交互的函数, 调用方可以向生成器发送数据, 生成器可以产生数据返回给调用方。

上面是开始yield的2个重要概念, 由后面要写yield from该语法python2没有, 我们直接使用python3

  • 调用方与协程是如何通过yield实现交互
QQ截图20170925095750.png

代码说明: 以上代码来源于流畅的python

  1. 计算历史数据的平均值<一>

# 创建协程对象
avg_arg_obj = avg_arg()

# 启动协程, avg_arg函数开始运行, 进入while循环, 在yield出暂停
next(avg_arg_obj)

# 向协程发送数据, 直接到term = yield代码的暂停出, yield左边的变量用于接收调用方send过来的数据,
yield右边暂时没有变量, 表示协程不生成数据给调用方。
avg_arg_obj.send(10) # term = 10 print(avg_num) is 10.0
avg_arg_obj.send(30) # 同上
20.0

  1. 计算历史数据的平均值<二>
2.png

这个代码比第一版复杂一点

  1. 首先实现一个类包装器(http://www.jianshu.com/p/30dae1d3e72c), 来包装协程, 该装饰器主要用来启动协程, 不用每次手动next启动协程
  2. yield出多了一个avg_num变量, 这个就是用来生成数据返回给调用者, 所以每次调用者send变量之后, term计算完之后, 协程yield出avg_num给调用方, 然后在yield出继续暂停等待send数据处理

3.计算历史数据的平均值<三>
终止协程和异常处理, 这个知识点可以去看流畅的python中查看这一章。 主要记住协程中未处理的异常会向上抛出。 如果发送send(None), break协程会向上抛出StopIteration, 协程此刻处于GEN_CLOSED状态不能再接受数据, 可以直接使用close()函数终止协程。

下面一章将继续介绍yield from
python从yield到asyncio<第一章>
python从yield到asyncio<第二章>
python从yield到asyncio<第二章>

相关文章

网友评论

      本文标题:python从yield到asyncio<第一章>

      本文链接:https://www.haomeiwen.com/subject/qisrextx.html