码迷,mamicode.com
首页 > 其他好文 > 详细

yield send 的一些使用细节

时间:2018-03-09 14:08:39      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:https   方法   一个   div   ref   turn   int   gen   enc   

其实日常中我们使用最多的是 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)
cant 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实现协程操作

 

yield send 的一些使用细节

标签:https   方法   一个   div   ref   turn   int   gen   enc   

原文地址:https://www.cnblogs.com/piperck/p/8533319.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!