python |
您所在的位置:网站首页 › 生成器send › python |
参考链接: http://www.mamicode.com/info-detail-2399245.html 作者首先介绍了生成器的作用:是为了让程序员可以更简单的编写用来产生值的序列的代码,然后又介绍了一些其他知识。 然后介绍了send是PEP 342加入的新特性 通过 send 方法来将一个值”发送“给生成器。 other = yield foo 这样的语句的意思是,"返回 foo 的值,这个值返回给调用者的同时,将 other 的值也设置为那个 send 发送的值" 重点:看这句 xx = yield yy摘要: send() 的作用是使xx赋值为发送的值(send的参数),然后让生成器执行到下个 yield .. 即先用 send(none) 启动,然后每次赋值,赋值后就相当于调用了 next() 使用 send(params) 需要区分情况。 def consumer(): r = '' while True: n = yield r if not n: return print('[CONSUMER] Consuming %s...' % n) r = '200 OK' def produce(c): c.send(None)#先用空值启动生成器 n = 0 while n < 5: n = n + 1 print('[PRODUCER] Producing %s...' % n) r = c.send(n)#启动后在传入真实的值 print('[PRODUCER] Consumer return: %s' % r) c.close() c = consumer() produce(c)#解释'''注意到consumer函数是一个generator,把一个consumer传入produce后: 首先调用c.send(None)启动生成器; 然后,一旦生产了东西,通过c.send(n)切换到consumer执行; consumer通过yield拿到消息(n接受赋值),处理,又通过yield把结果传回(返回r); produce拿到consumer处理的结果,继续生产下一条消息; produce决定不生产了,通过c.close()关闭consumer,整个过程结束。'''
注意:如果生成器未启动,则必须在使用send()前必须要启动生成器,而启动的方法可以是 generator.next() 或是 generator.send(None) 执行到第一个yield处。之后就可以使用 send(params) 不断传入值了。如果是已启动,则 send(params) 的作用就是对xx赋值为发送的值(send的参数),然后让生成器执行到下个yield.. 为什么需要 send(None) ,也很好理解,因为 生成器还没有走到第一个 yield 语句,如果我们发生一个真实的值,这时是没有人去“接收”它的。一旦生成器启动了,就对象接受(即=号左边的左值xx接受了),之后就可以使用 send(params) 不断传入值了 每次的 send() 都会运行到 yield 语句,但赋值不会执行,只会有返回值,相当于return后就退出函数了,所以在返回值之后的赋值就不会执行了。(不理解) 在我看来send()的作用是在next()的基础上,多了个给xx赋值的功能。 consumer 通过 yield 拿到消息(n接受赋值),处理,又通过 yield 把结果传回(返回r);然后执行到下一个 yield 处===>可以看出当send方法的参数为None时,它与next方法完全等价 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |