send()的用法

终于注册了csdn..不过密码这么复杂怕是过两天就忘了8

---

【挂起】的意思就是暂时保留先不进行 等待需要时再进行

先设置一个generator

def generator():
    v = yield 1
    v = yield v
    c = yield v

然后send(None)等同于next

调用方法为

gen=generator()
gen.send(None)

然后send 在有 a = yield a这种语句比较有用

也就是如果你用了gen.send(2)(在使用send之前要先使用next或者send(None)不然要报错)

gen.send(None)
gen.send(2)

如果是next的话第二个语句应该返回1,但是你用了send(2),v = yield 1这一句就变成了v = 2 于是下一行yield的v是2

同理再用gen.send(3)得到的就是3

再用一段代码解释一下

def MyGenerator():
        v = yield 1# yield:语句执行到yield就停止了 所以刚开始运行到这一句的时候v没有赋值为1,等到send(5)时(yield 1被视为传入的参数5) 此时这一句被执行,v=5
        v=yield v 
        b=yield v 
        v=yield v 
        c=yield b
gen = MyGenerator()
print (next(gen))
print (gen.send(5))# v = yield 1 ->v = 5 ,先yield v,未执行v = 这里的赋值语句
print (gen.send(7))# v = yield v ->v = 7 ,先yield v,未执行b = 这里的赋值
print (gen.send(5))# b = yield v ->b = 5 ,yield v(=7) ,未执行v = 这里的赋值
print (gen.send(7))# v = yield v ->v = 7 ,yield b(=5) 结束

感觉还是要理解yield的用法 总算是懂send()了 。。

再看看协程的例子

def consumer():#generator
    r = ''
    while True:
        n = yield r#consumer通过yield拿到消息,处理,又通过yield把结果传回;
        if not n:
            return
        print('[CONSUMER] Consuming %s...' % n)
        r = '200 OK'

def produce(c):
    c.send(None)#首先调用c.send(None)启动生成器,yield一个''进去
    n = 0
    while n < 5:
        n = n + 1
        print('[PRODUCER] Producing %s...' % n)
        r = c.send(n)#一旦生产了东西,通过c.send(n)切换到consumer执行;
        print('[PRODUCER] Consumer return: %s' % r)#produce拿到consumer处理的结果,继续生产下一条消息;
    c.close()#produce决定不生产了,通过c.close()关闭consumer,整个过程结束。

c = consumer()
produce(c)

这里的consumer因为有yield 是generator 按照执行的顺序来看,先是用了一个等同next()的c.send.(None) 这里应该是yield了一个'',也就是空的 就是为了协程而设置的语句 然后循环停在这里,等produce()开始用c.send(n),consumer的n得到赋值n=1,继续往下进行,又在yield处停止,如此循环。


emm先总结在这里 去看协程惹

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值