【发布时间】:2023-02-02 08:05:12
【问题描述】:
什么时候应该使用生成器表达式,什么时候应该在 Python 中使用列表理解?
# Generator expression
(x*2 for x in range(256))
# List comprehension
[x*2 for x in range(256)]
【问题讨论】:
-
[exp for x in iter]可以只是list((exp for x in iter))的糖吗?还是有执行差异? -
它认为我有一个相关的问题,所以当使用 yield 时,我们可以只使用函数中的生成器表达式,还是必须对函数使用 yield 来返回生成器对象?
-
@b0fh 对你的评论的回答很晚:在 Python2 中有一个微小的区别,循环变量会从列表理解中泄漏出来,而生成器表达式不会泄漏。比较
X = [x**2 for x in range(5)]; print x和Y = list(y**2 for y in range(5)); print y,第二个会报错。在 Python3 中,列表理解确实是生成器表达式的语法糖,正如您所期望的那样,它被馈送到list(),因此循环变量将为 no longer leak out。 -
我建议阅读PEP 0289。总结者“这个 PEP 引入了生成器表达式作为列表理解和生成器的高性能、内存高效的概括”.它还提供了有关何时使用它们的有用示例。
-
@icc97 我也迟到了八年,PEP 链接非常完美。感谢您使查找变得容易!
标签: python list-comprehension generator-expression