zoukankan      html  css  js  c++  java
  • python-生成器即send()用法

    参考链接:

      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后:

    1. 首先调用c.send(None)启动生成器;

    2. 然后,一旦生产了东西,通过c.send(n)切换到consumer执行;

    3. consumer通过yield拿到消息(n接受赋值),处理,又通过yield把结果传回(返回r);

    4. produce拿到consumer处理的结果,继续生产下一条消息;

    5. 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方法完全等价

  • 相关阅读:
    Xcode编译WebDriverAgentRunner报错:The bundle identifier for IntegrationApp.app couldn’t be read.解决方案
    python+django更新表结构执行相关命令报错:No installed app with label 'interface_crud'解决方案
    python激活虚拟环境env报错:no such file or directory: env/Scripts/activate解决方案
    Django创建api_crud app时报错:file "manage.py", line 16 ) from exc ^ SyntaxError: invalid syntax解决方案
    Redis未授权访问漏洞复现
    逻辑漏洞小结之SRC篇
    Linux下清空用户登录记录和命令历史的方法
    linux下直接清空日志的方法
    Linux Hackers/Suspicious Account Detection
    linux查看所有用户信息
  • 原文地址:https://www.cnblogs.com/Gaoqiking/p/10577309.html
Copyright © 2011-2022 走看看