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

Difference between send(None) and Next()

通过将 yield 语句重新定义为 PEP 342-- Coroutines via Enhanced Generators powerful new functionality was added to Python. David Beasley has an excellent presentation on Python coroutines A Curious Course on Coroutines and Concurrency 中的表达式。

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

调用 next() 与调用 send(None) 有什么优势吗? next() 是一个 Built_in 函数,所以也许这是一个因素,但似乎没有任何其他差异。我有点惊讶,向 next 添加一个可选变量似乎比添加一个做同样事情的新函数更 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

你缺少的是generators are a special case of iterators

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

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