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实现协程操作

 

posted @ 2018-03-09 13:06  piperck  阅读(410)  评论(0编辑  收藏  举报