【发布时间】:2011-08-10 20:22:33
【问题描述】:
想想我为它的副作用调用的函数,而不是返回值(如打印到屏幕、更新 GUI、打印到文件等)。
def fun_with_side_effects(x):
...side effects...
return y
现在,是不是 Pythonic 使用列表推导来调用这个函数:
[fun_with_side_effects(x) for x in y if (...conditions...)]
请注意,我不会将列表保存在任何地方
或者我应该这样称呼这个函数:
for x in y:
if (...conditions...):
fun_with_side_effects(x)
哪个更好,为什么?
【问题讨论】:
-
这是临界点,但你可能会得到更多的反对而不是支持。我要坐下这个:^)
-
这是一个简单的选择。可读性很重要——用第二种方法。如果您的屏幕上无法容纳 2 条额外的线,请使用更大的显示器 :)
-
@larsmans:如果 GvR 在他一开始引入列表推导时就意识到了这一点!
-
@larsmans,Steve Jessop,我认为将列表理解理解为循环是不正确的。它可以很好地实现为一个循环,但像这样的构造点是以功能和(概念上)并行的方式对聚合数据进行操作。如果语法有问题,那就是
for ... in在这两种情况下都使用了——导致这样的问题! -
@senderle:不过,我认为这取决于副作用。如果副作用一次只改变一个元素,独立地,那么我认为在命令式语言中使用函数式结构是完全合理的,因为重要的不是循环流程控制,而是每个人的应用程序元素。如果副作用使得顺序很重要,那么“理解”抽象可能开始泄漏。不过,它是否泄漏到足够重要的程度是另一个问题——没有人假装 Python 会进行惰性求值。