python映射中的副作用(python"do"块)

ToB*_*ced 2 python python-3.x

什么是告诉某人"我想要应用于func每个元素iterable的副作用" 的首选方式.

# Option 1... clear, but two lines.
for element in iterable:
    func(element)

# Option 2... even more lines, but could be clearer.
def walk_for_side_effects(iterable):
    for element in iterable:
        pass

walk_for_side_effects(map(func, iterable))  # Assuming Python3's map.

# Option 3... builds up a list, but this how I see everyone doing it.
[func(element) for element in iterable]
Run Code Online (Sandbox Code Playgroud)

我喜欢选项2; 标准库中是否有一个已经等效的函数?

Mar*_*ers 7

避免聪明的诱惑.使用选项1,它的意图是明确和明确的; 您正在将函数func()应用于iterable中的每个元素.

选项2只是让每个人感到困惑,寻找walk_for_side_effects应该做的事情(在我意识到你需要map()在Python 3中进行迭代之前,它肯定让我很困惑).

当您实际获得结果时func(),应使用选项3 ,从不使用副作用.Smack任何人只是为了副作用而这样做.列表推导应该用于生成列表,而不是做其他事情.相反,您需要更难理解和维护代码(并且为所有返回值构建列表的启动速度较慢).

  • 它很粗糙,因为它需要一个缩进块和一个不必要的变量的引入。对于习惯了函数式编程的人来说,这感觉非常脏。 (2认同)
  • @ToBeReplaced 当然,在列表理解中为函数的副作用构建一个列表对函数式程序员来说更脏!(无论如何,我觉得是这样,我宁愿写 Haskell 也不愿写 Python) (2认同)
  • @jimhark:只有你真的想要建立一个列表.简单地循环和调用函数比创建"无"返回值的列表更快. (2认同)