python3 协程

协程

协程与生成器类似,都是定义体中包含yield关键字的函数,区别于:

  • 协程中,yield通常出现在表达式的右边,可以产出值,如果yield后面没有表达式,那么生成器产出None。
  • 协程可以从调用方接受数据,使用.send(data),而不是next()函数.

1. 实例,使用协程极速按移动平均值

def average1():
    total = 0.0
    count = 0
    average = None
    
    while True:
        print('start')
        term = yield average
        total += term 
        count += 1
        average = total/count
        print('end')
        
>>>c = average1()
>>>next(c)  #预激协程,or c.send(None), 必须!
start
>>>c.send(12)
end
start
Out[54]: 12.0
>>>c.send(122)
end
start
Out[55]: 67.0

2. 使用装饰器自动预激协程

#使用装饰器自动预激协程
from functools import wraps
def coroutine(func):
    @wraps(func)
    def primer(*args, **kargs):
        gen = func(*args, **kargs)
        next(gen)
        return gen
    return primer

@coroutine
def average():
    total = 0.0
    count = 0
    average = None
    
    while True:
        print('start')
        term = yield average
        total += term 
        count += 1
        average = total/count
        print('end')

让协程返回值

#让协程返回值
from collections import namedtuple
Result = namedtuple('Result','count average')

def average3():
    count, average,total = 0, 0.0,0.0
    while True:
        term = yield 
        if term is None:
            break
        total += term
        count += 1
        average = total / count
    return Result(count, average)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值