send(None)和Next()之间的区别

Kev*_*evB 7 python generator

通过将yield语句重新定义为PEP 342中的表达式 - 通过增强型生成器的协同程序,Python中添加了强大的新功能.David Beasley在Python协同程序上提供了很好的演示,这是关于协同程序和并发的好奇课程.

正如PEP所述,每当通过正常的next()调用恢复生成器时,yield表达式的值为None.要实例化生成器,必须调用next()或send(None)(即最初不能发送非None值).

调用next()vs send(None)有什么好处吗?next()是一个Built_in函数,所以也许这是一个因素,但似乎没有任何其他差异.我有些惊讶,将下一个可选变量添加到Pythonic会比添加一个执行相同操作的新函数更加令人惊讶.我错过了什么吗?

这是一个简单的协程,通过将它们发送到协程来保持输入的总数.

import numbers
def running_sum() :
    g_in  = 0
    g_out = 0
    while g_in is not None :
        g_in = (yield g_out)
        if isinstance(g_in, numbers.Number) :
            g_out += g_in
        print 'in_val =',g_in,'sum =',g_out
Run Code Online (Sandbox Code Playgroud)

Kev*_*vin 6

您缺少的是generators 是 iterators 的特例

迭代器是(正确)实现__iter__()__next__()方法的任何东西。__iter__()在这种情况下,该方法只是应该返回迭代器本身。__next__()调用该方法以实现next().

然而,关键是它__next__() 没有参数(除了self)。该.send()方法不是迭代协议的一部分。在一般情况下,不需要迭代器来实现.send()。实际上,如果您调用iter([]),您将获得一个缺少该方法的对象。发送仅适用于真正的生成器(使用yield语法编写的函数)。相比之下,next()适用于任何迭代器。