我知道这个问题:
Difference between Python's Generators and Iterators
它的使用范围更广,技术上也较少。尚未选择任何答案。我还仔细阅读了这些答案,但有一个例外可能是找不到我想要的东西。我想问一个更精确的问题,以帮助我了解一些细节。
我之前问过这个问题:
What is the difference between a python itterator and a python generator?
也许我的标题或提问方式具有误导性,因为我得到的答复并未达到我的意图,问题在几秒钟内就被关闭。
所以我将在这里尝试澄清。
请考虑以下代码:
p = [k for k in range(1,1000)]
i = iter(p)
g = (k for k in p)
在i和g上可以进行一些操作来区分这两种构造。我可以用i做的事,而我不能用g做的事。它们的类型以列表迭代器与生成器对象的形式出现,但我不清楚这对它可以做什么或其效率有任何实际影响。我特意先构建了列表,以强调指出,预先生成或按需生成列表的问题不是问题所在。
[目前,我怀疑这个更普遍的问题的答案是-生成器是迭代器的特例,并且可以通过显式编写相应的迭代器来完成使用理解或屈服的生成器构造。使用生成器而不是迭代器的理由是有时编写起来更容易。
g
支持send
,就像所有生成器都支持,而i
不支持。 (send
到g
不是有用的>>,但是您可以做到。)
>>> g.send(None) 1 >>> i.send(None) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'list_iterator' object has no attribute 'send'
您还可以将
throw
的异常添加到g
或close
中,这是使用i
无法做到的。
i
可以腌制,而g
不能腌制。
除此之外,您可以进行各种显式检查和自省以区别它们。检查类型,检查str
输出,寻找仅存在于一个或另一个上的属性(例如g.gi_frame
),等等。
[这大部分是实现细节或附带的,不是您应该认为的“生成器与迭代器之间的区别”。生成器是一种迭代器。
以下是文档摘录: