如何识别生成器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
引用生成器表达式文档:
仅带有一个参数的调用可以省略括号。有关详细信息,请参见“
通话
”部分。