如何识别生成器vs列表理解


问题内容

我有这个:

>>> sum( i*i for i in xrange(5))

我的问题是,在这种情况下, 我是否要传递列表理解或生成器对象 求和?我该怎么讲?周围是否有一般规则?

还请记住, sum本身需要一对括号来包围其参数。 我认为上面的括号是求和而不是用于创建生成器对象。你不同意吗?


问题答案:

您正在传递生成器表达式

一个列表理解与方括号中指定的[...])。列表理解首先建立一个 列表对象 ,因此它使用与列表文字语法密切相关的语法:

list_literal = [1, 2, 3]
list_comprehension = [i for i in range(4) if i > 0]

另一方面,生成器表达式创建迭代器对象。只有在对该对象进行迭代 ,才会执行包含的循环并生成项目。生成器表达式不 保留
这些项目;没有正在构建的列表对象。

生成器表达式始终使用(...)舍入括号,但是当用作调用的 唯一 参数时,可以省略括号。以下两个表达式是等效的:

sum((i*i for i in xrange(5)))  # with parenthesis
sum(i*i for i in xrange(5))    # without parenthesis around the generator

引用生成器表达式文档:

仅带有一个参数的调用可以省略括号。有关详细信息,请参见“
通话
”部分。