zoukankan      html  css  js  c++  java
  • yield send 的一些使用细节

    其实日常中我们使用最多的是 return 很少会使用到 yield 去创造一个生成器。一般就是算算算 算完之后用 return 返回一把。

    但是有些情况下 比如需要节约内存不需要一把全部返回,每次使用的时候再去算,我们就会用到生成器。

    可以从一个最简单例子来看看:

    def cool():
        while True:
            x = yield
            print '瓦哈哈哈哈哈 {}'.format(x)    
    
    x = cool()
    <generator object cool at 0x10eee4f00>
    
    x.next()
    
    x.next()
    瓦哈哈哈哈哈 None

    可以注意到,我在第一次调用 x.next() 的时候什么输出都没有。其实这里的行为是 yield 接收到一个 None 值。不管我们是使用 send 还是使用 next 方法都会触发继续向下执行。而且在遇到 yield 的时候会停下来。

    send 方法更有趣一点,send 方法类似于实现了两个功能,一个是 send 一个值给 yield 同时执行 next。来看一下:

    x.send(234)
    can't send non-None value to a just-started generator

    什么情况,不是说好的 send 可以当 next 用吗?

    HHH 其实还有个设定,如果未初始化 生成器的话,第一次必须使用 send(None) 初始化一把。 所以让我们再来试试:

    x = cool()
    x.send(None)
    x.send(123)
    瓦哈哈哈哈哈 123

    可以看到还是调用 send 第一次我发 None 初始化这个 generator。然后 send(123) 就可以正常运行了。注意这里发送的 123 是发送给 yield 的。而不是给 x 的。

    Reference:

    https://www.cnblogs.com/vipchenwei/p/7049404.html  yield与send实现协程操作

  • 相关阅读:
    eclipse新建工作空间后的常用设置
    Maven将代码及依赖打成一个Jar包的方式
    MemCache详细解读(转)
    memcached单机或热备的安装部署
    memcache的基本操作
    Java中int和String类型之间转换
    Linux中普通用户配置sudo权限(带密或免密)
    Java字符串中常用字符占用字节数
    java各种数据类型的数组元素的默认值
    validator
  • 原文地址:https://www.cnblogs.com/piperck/p/8533319.html
Copyright © 2011-2022 走看看