生成器表达式为什么被称为“生成器”?

4
一方面我们有:
  • 列表生成式 [x for x in range(10)]
  • 集合生成式 {x for x in range(10)}
  • 字典生成式 {x: x for x in range(10)}
另一方面我们有:
  • 生成器表达式 (x for x in range(10))
为什么前面三个“表达式”被称为“生成式”,而最后一个被称为“表达式”呢?它们的表现形式几乎相同,我猜它们的工作方式也非常相似。这背后是否有微妙的原因?这只是出于好奇而已。
参考资料:

在推导式中,赋值时所有的值都已经存在于内存中。而在生成器中,下一个值直到你需要它时才会被计算。这对于每个值都需要你取出上一个值并在运行时对其执行操作的情况非常有用。 - Rashid 'Lee' Ibrahim
3
请看 https://nedbatchelder.com/blog/201605/generator_comprehensions.html - superb rain
@superbrain 谢谢!这非常有用!所以基本上,“最初理解是“字面显示”概念的一部分。GenExprs不是显示。”这就是它们有不同名称的原因。 - Riccardo Bucco
1
如果有帮助的话,我认为列表/集合推导式就像是直接量中的生成器表达式,尽管这不完全正确。 - wjandrea
1个回答

5

理解式会立即执行内部for循环并生成新的对象。一旦运行,它们就已经“完成”了。

生成器是惰性评估的——它们会立即返回,并返回一个对象,该对象稍后将产生单个值。


1
谢谢你的回答。然而,我知道它们是做什么的,我只是想了解为什么它们有不同的名称。例如,为什么它们不被称为表达式? - Riccardo Bucco
6
它们有不同的名称是因为它们执行不同的功能。生成器仅生成值。而推导式包含了这些生成的值的全面集合。 - Samwise
2
“表达式”基本上是任何具有值的东西。这是一个非常通用的编程术语。 - Samwise
1
@Samwise 但是推导式确实会返回一个值,不是吗?这就是为什么我不明白为什么我们不能称它们为表达式的原因。 - Riccardo Bucco
2
并非所有的生成器都是(单个)表达式--你说“生成器表达式”来指代一个作为生成器的单个表达式,将其与“生成器函数”区分开来,后者由多个创建生成器的表达式组成。所有的推导都是表达式,因此“推导表达式”是多余的。 - Samwise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接