6

告诉某人“我想将其应用于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]

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

4

2 回答 2

8

避免聪明的诱惑。使用选项 1,其意图清晰明确;您正在将该函数func()应用于迭代中的每个元素。

选项 2 只是让每个人都感到困惑,寻找应该做什么(这确实让我感到困惑,直到我意识到你需要在 Python 3walk_for_side_effects中迭代)。map()

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

于 2013-01-21T21:36:10.390 回答
2

这已被多次询问,例如,herehere。但这是一个有趣的问题。列表推导旨在用于其他用途。

其他选项包括

  1. 使用map()- 与您的样品基本相同
  2. 使用filter()- 如果你的函数返回 None,你将得到一个空列表
  3. 只是一个普通的for循环

而普通循环是最好的方法。在这种情况下,在语义上是正确的,所有其他方式,包括列表理解,滥用概念的副作用。

在 Python 3.x 中,map()并且filter()是生成器,因此在迭代它们之前什么都不做。因此,我们需要例如 a list(map(...)),这会使情况变得更糟。

于 2013-01-21T21:44:10.093 回答