python学习05协程_2

1、停止协程与异常处理
2、协程返回值
协程中未处理的值会向上冒泡,传给next函数或send方法的调用方(即触发协程的对象)

def make_avg():
    total = 0
    count = 0
    avg = None
    while True:
        term = yield avg
        total += term
        count += 1
        avg = total / count

avg_coro = make_avg()

next(avg_coro)
print(avg_coro.send(5))
avg_coro.send('abc')#发送的不是数字,导致协程内部异常

由于在协程内没有处理异常,协程会终止p y。如果尝试重新激活协程,会抛出StopIteration异常,所以终止协程可以通过发送某个哨符值,让协程退出。

class DemoException(Exception):
    pass

def demo_exc_handing():
    print('coroutine started')
    while True:
        try:
            x = yield

        except DemoException:
            print('DemoExcep')
        else:
            print('coroutine received: ',x)

    raise RuntimeError('this line shoule never run')

exc_coro = demo_exc_handing()
next(exc_coro)
exc_coro.send(2)
exc_coro.close()
from inspect import getgeneratorstate
print(getgeneratorstate(exc_coro))#查看状态
exc_coro2 = demo_exc_handing()
next(exc_coro2)
exc_coro2.send(1)
exc_coro2.throw(DemoException)#传入协程可以处理的异常
exc_coro2.throw(ZeroDivisionError)

#协程返回值

from collections import namedtuple
Result = namedtuple('Result','count average')
def make_avg():
    total = 0
    count = 0
    avg = None
    while True:
        term = yield
        #为了返回值,协程必须正常终止
        if term is None:
            break
        total += term
        count += 1
        avg = total / count
    return Result(count,avg)
avg_coro = make_avg()
next(avg_coro)
print(avg_coro.send(10))
print(avg_coro.send(20))
try:
    avg_coro.send(None)
except StopIteration as e:
    result = e.vaule
print(result)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值