预激装饰器

 讨论如何终止协程之前,我们要先谈谈如何启动协程。使用协程之前必须预激,可是这一
步容易忘记。为了避免忘记,可以在协程上使用一个特殊的装饰器。接下来介绍这样一个
装饰器。 预激协程的装饰器,
from functools import wraps def corountine(func):
'''
装饰器:向前执行到第一个 yield 表达式,预激协程 func
:param func:
:return:
'''
@wraps(func) # functools.wraps 则可以将原函数对象的指定属性复制给包装函数对象, 默认有 __module__、__name__、__doc__,或者通过参数选择
def primer(*args, **kwargs): # 把被装饰的生成器函数替换成这里的 primer 函数;调用 primer 函数时,返回预激后的生成器
gen = func(*args, **kwargs) # 调用被装饰的函数,获取生成器对象。
next(gen) # 预激生成器
return gen # 返回生成器
return primer @corountine # 预激装饰器
def coro_average():
total = 0.0
count = 0
average = None
while 1:
term = yield average
total += term
count += 1
average = total/count coro3 = coro_average()
#print (coro3.send(None)) # 若没有 预激装饰器 需要 调用 send(None) 或 next(coro) 完成预激,即让代码跑到第一个 yield 处
print (coro3.send(5))
print (coro3.send(7))
print (coro3.send(10))
coro3.close() 这个无限循环表明,只要调用方不断把值发给这个协程,它就会一直接收值,然后生
成结果。仅当调用方在协程上调用 .close() 方法,或者没有对协程的引用而被垃圾回收
程序回收时,这个协程才会终止。
这里的 yield 表达式用于暂停执行协程,把结果发给调用方;还用于接收调用方后面
发给协程的值,恢复无限循环。
使用协程的好处是, total 和 count 声明为局部变量即可,无需使用实例属性或闭包在
多次调用之间保持上下文。 调用 next(coro3) 函数后,协程会向前执行到
yield 表达式,产出 average 变量的初始值——None,因此不会出现在控制台中。此
时,协程在 yield 表达式处暂停,等到调用方发送值。 coro3.send(5) 那一行发送
一个值,激活协程,把发送的值赋给 term,并更新 total、 count 和 average 三个变量
的值,然后开始 while 循环的下一次迭代,产出 average 变量的值,等待下一次为
term 变量赋值.

最新文章

  1. Android自定义控件之自定义组合控件
  2. PDF/WORD/EXCEL/PPT 文档在线阅读
  3. phpMailer在thinkPHP框架中邮件发送
  4. AsynTask用法
  5. webView.loadUrl 错误:A WebView method was called on thread 'JavaBridge'.
  6. VB已死?还是会在Roslyn之下焕发新生?
  7. 19. 求平方根序列前N项和
  8. Python学习笔记3
  9. margin-塌陷问题
  10. Spring Boot2.0 设置拦截器
  11. CentOS 7编译OpenWRT
  12. UVA11107 Life Forms
  13. C++面试基础之回调
  14. CSS实现元素水平垂直居中
  15. Houdini技术体系 基础管线(四) :Houdini驱动的UE4植被系统 下篇
  16. C/C++和Lua是如何进行通信的?
  17. pip virtualenv requirement
  18. easyui表格,单元格合并
  19. mybatis 之 resultType="Integer"
  20. 算法笔记--KMP算法 && EXKMP算法

热门文章

  1. Download EditPlus Text Editor
  2. Java Calendar类(java.util包)
  3. winds消息大全
  4. .net core webapi搭建(3)Code first+拆层三层+仓储
  5. 痞子衡嵌入式:ARM Cortex-M内核那些事(3.2)- 安全模块看特性(M23/33/35P)
  6. CSS动效集锦,视觉魔法的碰撞与融合(三)
  7. 关于Xen
  8. c/python 的区别
  9. Spring中的BeanPostProcessor详解
  10. Centos 7 最小化部署svn版本控制(svn协议)