通过将yield语句重新定义为PEP 342-- Coroutines via Enhanced Generators中的表达式,Python中添加了强大的新功能。davidbeasley有一个关于Python协程的极好的演示A Curious Course on Coroutines and Concurrency。在
正如PEP所述,每当生成器通过正常的next()调用恢复时,yield表达式的值为None。要实例化生成器,必须调用next()或send(None)(即最初不能发送非None值)。在
调用next()与send(None)有什么优势吗?next()是一个内置函数,所以这可能是一个因素,但似乎没有任何其他区别。我有点惊讶,在next中添加一个可选变量比添加一个执行相同操作的新函数看起来更像python。我错过什么了吗?在
下面是一个简单的协同程序,通过将输入的数字发送到协同程序来保持输入的数字总数。在
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__()
方法只需返回迭代器本身。调用__next__()
方法来实现next()
。在然而,关键在于
__next__()
不带参数(除了self
)。.send()
方法不是迭代协议的一部分。在一般情况下,不需要迭代器来实现.send()
。实际上,如果您调用iter([])
,您将得到一个缺少该方法的对象。发送只适用于真正的生成器(使用yield
语法编写的函数)。相比之下,next()
可以在任何迭代器上工作。在相关问题 更多 >
编程相关推荐