考虑一下我调用的函数的副作用,而不是返回值(比如打印到屏幕、更新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)
哪一个更好?为什么?
发布于 2011-04-22 16:24:33
这样做是非常反Pythonic的,任何经验丰富的Pythonista都会让你下地狱。中间列表在创建后被丢弃,它可能非常非常大,因此创建成本很高。
发布于 2011-04-22 16:38:35
你不应该使用列表理解,因为正如人们所说的那样,这将建立一个你不需要的大的临时列表。以下两种方法是等效的:
consume(side_effects(x) for x in xs)
for x in xs:
side_effects(x)
使用itertools
手册页中的consume
定义:
def consume(iterator, n=None):
"Advance the iterator n-steps ahead. If n is none, consume entirely."
# Use functions that consume iterators at C speed.
if n is None:
# feed the entire iterator into a zero-length deque
collections.deque(iterator, maxlen=0)
else:
# advance to the empty slice starting at position n
next(islice(iterator, n, n), None)
当然,后者更清晰,也更容易理解。
发布于 2011-04-22 16:27:27
列表理解是用于创建列表的。除非你真的在创建列表,否则你不应该使用列表理解。
因此,我会得到第二种选择,只需迭代列表,然后在条件适用时调用函数。
https://stackoverflow.com/questions/5753597
复制相似问题