预激装饰器

 讨论如何终止协程之前,我们要先谈谈如何启动协程。使用协程之前必须预激,可是这一
步容易忘记。为了避免忘记,可以在协程上使用一个特殊的装饰器。接下来介绍这样一个
装饰器。 预激协程的装饰器,
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 变量赋值.

Coroutine 预激装饰器的更多相关文章

  1. day11 - 15(装饰器、生成器、迭代器、内置函数、推导式)

    day11:装饰器(装饰器形成.装饰器作用.@语法糖.原则.固定模式) 装饰器形成:最简单的.有返回值的.有一个参数的.万能参数 函数起的作用:装饰器用于在已经完成的函数前后增加功能 语法糖:使代码变 ...

  2. day4之装饰器进阶、生成器迭代器

    装饰器进阶 带参数的装饰器 # 某一种情况# 500个函数加装饰器, 加完后不想再加这个装饰器, 再过一个季度,又想加上去# 你可以设计你的装饰器,来确认是否执行 # 第一种情况 # 想要500个函数 ...

  3. python装饰器、迭代器、生成器

    装饰器:为已存在的函数或者或者对象添加额外的功能 def wrapper(f): #装饰器函数,f是被装饰的函数 def inner(*args,**kwargs): '''在被装饰函数之前要做的事' ...

  4. Java IO流以及装饰器模式在其上的运用

    流概述 Java中,流是一种有序的字节序列,可以有任意的长度.从应用流向目的地称为输出流,从目的地流向应用称为输入流. Java的流族谱 Java的 java.io 包中囊括了整个流的家族,输出流和输 ...

  5. 设计模式(八)装饰器模式Decorator(结构型)

    设计模式(八)装饰器模式Decorator(结构型) 1. 概述 若你从事过面向对象开发,实现给一个类或对象增加行为,使用继承机制,这是所有面向对象语言的一个基本特性.如果已经存在的一个类缺少某些方法 ...

  6. Python-老男孩-02_装饰器_面向对象_封装_继承_异常_接口_数据库

    装饰器其实也是一个函数,它的参数是一个函数 ; 其它函数与装饰器之间建立联系是通过 @装饰器函数名, 感觉有点像Spring的面向切面编程 装饰器函数,如何处理原函数的参数.?  装饰器 原函数返回值 ...

  7. Python装饰器、内置函数之金兰契友

    装饰器:装饰器的实质就是一个闭包,而闭包又是嵌套函数的一种.所以也可以理解装饰器是一种特殊的函数.因为程序一般都遵守开放封闭原则,软件在设计初期不可能把所有情况都想到,所以一般软件都支持功能上的扩展, ...

  8. python_装饰器

    越来越觉得写一点技术博客是有多么重要了,明日复明日,现在就开始写吧! 1. 普通装饰器 装饰器的写法是一种语法糖,装饰器也还是一个函数而已,它接收一个函数对象作为参数,并返回一个新函数,主要是拓展原函 ...

  9. 初学Python——装饰器

    一.什么是装饰器 当我们做好一个产品之后,需要对它进行不断地维护,对某些函数增加一些功能.这个时候如果去修改源代码将是非常不合适的.(原因:1.原则上已经写好的函数尽量不去修改它,因为一旦修改可能会导 ...

随机推荐

  1. mysql高级复习

    MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.可以得到索引的本质:索引是数据结构,可以简单理解为“排好序的快速查找数据结构”. 数据本身之外,数据库还维护着一 ...

  2. go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer)

    目录 go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer) demo demo server demo client 池 dao service p2c ro ...

  3. 解决 VS Code 中 golang.org 被墙导致的 Go 插件安装失败问题

    微软官方开发的 Go for Visual Studio Code 插件为 Go 语言 提供了丰富的支持.在 VS Code 中首次打开 Go 工作区后,VS Code 会自动检测当前开发环境为 Go ...

  4. 一张图快速上手Xmind思维导图

    使用软件:Xmind8 pro版(可在网上找破解版),应用广泛,功能强大

  5. 痞子衡嵌入式:ARM Cortex-M内核那些事(3.2)- 安全模块看特性(M23/33/35P)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是ARM Cortex-M功能模块,不过侧重点是三款安全特性处理器. ARM Cortex-M处理器家族发展至今(2020),已有8代产品 ...

  6. 【Vue】强化表单的9个Vue输入库

    一个设计不当的表单可能会使用户远离你的网站.幸运的是,对Vue开发者,有大量可用的Vue输入库让你轻松整理表单. 拥有直观而且对用户友好的表单有诸多好处,比如: 更高的转化率 更好的用户体验 更专业的 ...

  7. 如何在GitHub上大显身手?

    推荐一篇良许大佬的文章,如何在github上大显身手.拥有自己的github,且有所贡献,这是一件很有意义的的事情,在面试上也是加分项哦,赶紧搞起来. 转载至http://uee.me/aHAfN 这 ...

  8. pc端的弹性布局适配方案

    方案及原理:使用rem单位,通过window.onresize来监听浏览器窗口,获取窗口宽度,并改变跟字体大小来达到弹性适配效果. function adaptor(){ //为了便于计算,这里以19 ...

  9. 工具之cut

    转自http://www.cnblogs.com/dong008259/archive/2011/12/09/2282679.html cut:正如其名就是“剪”,和sed一样,一行为单位,对数据进行 ...

  10. ios---apple mach-o linker error 报错解决

    问题触发场景 在新xcode环境里配置了cocoapods,并运行了自己的项目.然后某日从其他地方clone了第三方项目,打开后,有了这个报错: 问题原因 1.用cocoapods装了第三方插件后,要 ...