Python 3:不是生成器的迭代器?

Python 3: Iterator that is NOT a generator?

我想了解迭代器和生成器之间的区别。我读到“每个生成器都是一个迭代器,但反之亦然。”

有人可以举例说明一个对象是迭代器,但不是生成器吗?

我的意思是,如果一个对象有方法next(这是迭代器的定义),我们也可以称它为生成器,不是吗?

UPD:对于那些说发电机必须有 yield 的人 - 并非总是如此。 (i**2 for i in range(1,5)) 没有收益,也是一个生成器。

对于那些说 iter([1,2,3]) 不是生成器的人 - 为什么?它与生成器的哪个定义相矛盾,在哪里?

"Every generator is an iterator, but not vice versa."

我认为这不一定是真的。 Python glossary 给出了 3 个以“generator”开头的条目。

发电机

这是任何带有 yield 语句的函数。生成器函数不是迭代器,但在您调用它时它 return 是一个迭代器。

def getSquares(n):
    for i in range(n):
        yield i**2

生成器迭代器

这是由生成器函数return编辑的东西。

生成器表达式

这只是括号内的理解。

(i**2 for i in range(10))

生成器表达式和生成器函数的 return 值在调用 type 时都会给出 <class 'generator'>。但是,如果您使用 __next__ 方法定义自己的 class,它的实例当然会将 class 作为它们的 type