我看到使用list comprehension提供了一种在Python中创建新列表的简单方法。
但是,如果不是创建一个新列表而只是想为列表中的每个参数调用一个void函数而不期望任何类型的返回值,我应该使用列表理解还是只使用for循环来迭代?代码的简单性是否适合为每组迭代创建一个新列表(即使它保持为空)?即使这些增加的成本在小型程序中可以忽略不计,在大型程序/生产中这样做是否有意义?
谢谢!
答案 0 :(得分:3)
如果您实际上不需要列表,列表推导是错误的方式。请改用:
for i in seq:
some_function(i)
与使用相比,这更有效,更具表现力:
[some_function(i) for i in seq]
请注意,有类似的东西不起作用(特别是它不是元组理解):
(some_function(i) for i in seq)
因为它只会创建一个迭代器。如果你实际传递一个只能迭代一次的列表,那么传递这样一个迭代器是一个更好的解决方案。
答案 1 :(得分:2)
for x in lst: f(x)
看起来同样短(实际上是一个字符更短)
[f(x) for x in lst]
或者那不是你想要做的吗?
答案 2 :(得分:1)
在列表的每个成员上调用函数还有更多可能的解决方案:
numpy可以向量化函数
import numpy as np
def func(i):
print i
v_func = np.vectorize(func)
v_func(['one', 'two', 'three'])
python有一个内置的map函数,它在一个可迭代的每个成员上映射一个函数
def func(i):
print i
map(func, ['one', 'two', 'three'])
答案 3 :(得分:0)
您是否在询问创建不需要的列表是否效率低下?这样,答案应该是显而易见的。
(为了满足答案警察:是的,创建一个你不需要的列表效率较低。)