首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >生成器表达式与列表理解

生成器表达式与列表理解
EN

Stack Overflow用户
提问于 2008-09-07 04:07:59
回答 8查看 159.5K关注 0票数 460

在Python中,什么时候应该使用生成器表达式,什么时候应该使用列表理解?

代码语言:javascript
复制
# Generator expression
(x*2 for x in range(256))

# List comprehension
[x*2 for x in range(256)]
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2008-09-06 20:54:08

John's answer是好的(当你想要多次迭代一些东西时,列表理解会更好)。但是,还值得注意的是,如果您想使用任何list方法,就应该使用list。例如,以下代码将不起作用:

代码语言:javascript
复制
def gen():
    return (something for something in get_some_stuff())

print gen()[:2]     # generators don't support indexing or slicing
print [5,6] + gen() # generators can't be added to lists

基本上,如果您所做的只是迭代一次,则使用生成器表达式。如果您想存储和使用生成的结果,那么使用列表理解可能会更好。

由于性能是选择一个而不是另一个的最常见原因,我的建议是不要担心这一点,只选择一个;如果您发现程序运行太慢,那么也只有到那时,您才应该回去考虑代码的调优问题。

票数 328
EN

Stack Overflow用户

发布于 2008-09-06 20:10:59

当结果需要多次迭代时,或者速度非常重要时,请使用列表理解。在范围很大或无限大的地方使用生成器表达式。

有关详细信息,请参阅Generator expressions and list comprehensions

票数 125
EN

Stack Overflow用户

发布于 2008-10-10 01:42:30

生成器表达式的好处是它使用较少的内存,因为它不会一次构建整个列表。生成器表达式最适合在列表作为中介时使用,例如对结果求和,或根据结果创建字典。

例如:

代码语言:javascript
复制
sum(x*2 for x in xrange(256))

dict( (k, some_func(k)) for k in some_list_of_keys )

这样做的好处是列表不是完全生成的,因此使用的内存很少(而且应该会更快)

但是,当期望的最终产品是列表时,您应该使用列表理解。您不会使用生成器表达式保存任何内存,因为您需要生成的列表。您还可以使用任何列表函数,如排序或反转。

例如:

代码语言:javascript
复制
reversed( [x*2 for x in xrange(256)] )
票数 50
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档