python 协程

def consumer():
    n = 0
    while True:
        n = yield n
        n = n - 1
        print "del. 1"
        
def producer(consumer):
    n = 0
    next(consumer) #equal to consumer.next() or consumer.send(None)
    while n < 6:
        n = n + 2
        print "add 2, now is %d" %(n)
        n = consumer.send(n)
        print 'now is %d' %(n)
    consumer.close()
        
        
producer(consumer())


打印出来的结果是:

add 2, now is 2
del. 1
now is 1
add 2, now is 3
del. 1
now is 2
add 2, now is 4
del. 1
now is 3
add 2, now is 5
del. 1
now is 4
add 2, now is 6
del. 1
now is 5
add 2, now is 7
del. 1
now is 6

用一种十分不恰当的说法解释下上面中这个程序

函数producer先执行next启动生成器,生成器函数(对象)开始执行,执行到n = yield n语句时,我们需要先执行yield n,并且yield n语句的返回值赋值给n。执行yield n的结果貌似使得next(consumer) 函数返回,且函数的返回值为yield n中的n值,此时函数向下执行,进入while循环,在循环中执行到consumer.send(n),这样貌似我们又进入了函数(生成器对象)consumer中了,此时函数中的yield n语句返回,返回值是consumer.send(n)中的n值,故n = yield n中赋值语句左端的变量n得到赋值,程序继续向下执行,再次遇到n = yield n语句,如此循环往复。


其实我们使用contextlib模块,也是利用了yield的这个特性


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值