生成器表达式与列表推导式
在Python中,什么时候应该使用生成器表达式,什么时候应该使用列表推导式呢?
# Generator expression
(x*2 for x in range(256))
# List comprehension
[x*2 for x in range(256)]
13 个回答
140
当你需要多次遍历结果,或者速度非常重要时,可以使用列表推导式。对于范围很大或者是无限的情况,建议使用生成器表达式。
想了解更多信息,可以查看生成器表达式和列表推导式的相关内容。
250
遍历 生成器表达式 或 列表推导式 的效果是一样的。不过,列表推导式 会先把整个列表都放到内存里,而 生成器表达式 则是边生成边使用,这样你就可以用它来处理非常大的(甚至是无限大的!)数据序列。
358
约翰的回答很好,他提到当你需要多次遍历某个东西时,列表推导式更好。不过,还有一点值得注意的是,如果你想使用列表的方法,就应该用列表。例如,下面的代码是不能工作的:
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
简单来说,如果你只是想遍历一次,就用生成器表达式。如果你想保存并使用生成的结果,那你可能更适合用列表推导式。
因为性能是选择这两者之间最常见的原因,我的建议是不要太担心这个,随便选一个;如果你发现你的程序运行得太慢,那时候再回过头来考虑如何优化你的代码。