send(None)和Next()之间的差异

2024-05-21 01:03:05 发布

您现在位置:Python中文网/ 问答频道 /正文

通过将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

Tags: 函数innonesend表达式数字语句out
1条回答
网友
1楼 · 发布于 2024-05-21 01:03:05

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

迭代器是(正确地)实现__iter__()__next__()方法的任何东西。在本例中,__iter__()方法只需返回迭代器本身。调用__next__()方法来实现next()。在

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

相关问题 更多 >