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()
适用于任何迭代器。
通过将 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()
适用于任何迭代器。