Python 当我创建基于类的生成器时,为什么要调用下一个?

Python 当我创建基于类的生成器时,为什么要调用下一个?,python,Python,我是Python新手,正在读《Python技巧》一书。在关于生成器的章节中,它给出了以下示例(有一些更改) 为什么我必须在循环中调用next(X) 我(认为)我理解在循环行定义中将调用\uuuuuuuuuuuuuuuuuuuuuuuu函数,并且在每次迭代中将调用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu,但我不理解为什么我必须在循环内再次调用next。这不是多余的吗? 如果我不调用\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

我是Python新手,正在读《Python技巧》一书。在关于生成器的章节中,它给出了以下示例(有一些更改)

为什么我必须在循环中调用
next(X)

我(认为)我理解在循环行定义中将调用
\uuuuuuuuuuuuuuuuuuuuuuuu
函数,并且在每次迭代中将调用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
,但我不理解为什么我必须在循环内再次调用next。这不是多余的吗?
如果我不调用
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
函数,我的循环将永远运行。return的常规函数

def __next__(self):
    if self.count < self.max_times:
        self.count += 1
        return self.value   # return to provide one value on call
    raise StopIteration     # raise to end iteration
这要求您在生成器上调用
next
,以实际获取值。类似地,由于您将
BoundedGenerator.\uuu next\uu
定义为生成器函数,因此每个迭代步骤仅提供一个新的生成器


使用
return
而不是
yield
确实会返回值,而不是生成所述值的生成器。此外,当完成时,您应该
提出StopIteration
——这表示迭代结束。

这不是因为您使用生成器,生成器的存在允许您编写迭代器而不需要类开销。因此,生成器函数对于iterable(或任何您想要从中返回迭代器的方法)来说是一个很好的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法,但是它作为迭代器类的
\uuuuuuuuuuuuu,这是一个可怕而令人困惑的例子,如果它来自那本书,它会把生成器、迭代器和iterable(三个不同但相关的概念)的水弄脏嗨,谢谢你的解释和时间。为了说明作者的观点,他从这类示例开始,但继续使用生成器函数和生成器表达式,他给出了相同的观点,即我可以使用其他两个选项(表达式或函数)中的一个实现相同的目标,而无需使用此样板代码。谢谢您的时间和解释。我知道这是有道理的。
for x in BoundedGenerator('Hello world', 4):
    print(next(x))
def __next__(self):
    if self.count < self.max_times:
        self.count += 1
        return self.value   # return to provide one value on call
    raise StopIteration     # raise to end iteration
>>> def foo():
...    yield 1
...
>>> foo()
<generator object foo at 0x106134ca8>