通过在PEP 342-- 增强生成器的协程中将yield语句重新定义为表达式,Python增加了强大的新功能。David Beasley在Python协程上有一次很好的演讲:关于协程和并发的好奇课程。
正如PEP所述,每当生成器通过普通的next()调用恢复时,yield表达式的值都是None。要实例化生成器,必须调用next()或send(None)(即最初不能发送非None值)。
调用next()与send(None)相比是否有任何优势?next()是一个内置函数,因此这可能是一个因素,但似乎没有其他区别。我有些惊讶,这似乎更符合Python的风格,因为向next添加一个可选变量比添加一个执行相同操作的新函数更好。我有什么疏忽吗?
下面是一个简单的协程示例,用于保留输入数字的累加总和,通过将它们发送到协程中实现。
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