【发布时间】:2020-09-14 08:06:24
【问题描述】:
我知道这个问题:
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 做的事情,诸如此类。它们的类型以列表迭代器与生成器对象的形式出现,但我不清楚这对人们可以用它做什么或它的效率有任何实际影响。我特意先构建了列表,以强调预先或按需生成列表的问题不是问题所在。
目前,我怀疑更一般的问题的答案是这样的 - 生成器是迭代器的一个特例,无论你可以使用推导式或产量来构造生成器,都可以通过显式编写相应的迭代器来完成。使用生成器而不是迭代器的理由是有时它更容易编写。
后来我发现这个问题引发了对该主题的一些很好的阐述。
【问题讨论】:
-
嗯,是的,添加了生成器作为创建迭代器的便捷方式。它们也很有表现力,通常提供更简洁的代码。生成器也可以充当协程,因此您可以将
.send值放入生成器...如果您只是想区分类型,可以使用Generator = type((None for _ in range(0)))然后只需检查isinstance(some_object, Generator) -
Here's 一些不错的读物。
-
谢谢大家。我想声明一下,我理解并使用了几种语言中涉及的概念。我一直在寻找直截了当的技术细节——因为我似乎在翻阅似乎花费大量时间解释概念而不是实现的文档时无处可去。恕我直言。