0

有没有一种方法可以将一个函数(相同的函数)附加到数组的所有元素上,而无需遍历并一个一个地附加它?

所以喜欢

# create function foo from some computation
foo # some def    

# list
objects # list of objects

# attach same foo function to all elements of objects
# maybe using a decorator?

# loop through list to execute foo
for obj in objects:
    obj.foo()

让我再解释一下:

当然我可以只分配一个对象的值,比如

obj.attr = value

或对象列表:

for obj in objects:
    obj.attr = value

我要避免的是在每个对象上设置 attr 的值,而是在整个列表/数组上应用一个函数,每个元素都会执行该函数。

4

3 回答 3

4

您可以创建一个函数来包装它:

def for_each(l, f):
    for item in l:
        f(item)

然后对于一个函数foo,你可以这样做:

for_each(objects, foo)

对于一种方法foo,您可以这样做:

for_each(objects, lambda item: item.foo())

或这个:

from operator import methodcaller
for_each(objects, methodcaller('foo'))

在 Python 2 中,您还可以使用map

map(foo, objects)

对于 Python 3,您必须将其包装在list(...). 在任一版本中,您都可以使用列表推导:

[foo(item) for item in objects]

但是,如果您只是为了它的副作用而不是以某种方式转换列表而调用该函数,我建议您不要使用最后两种方式,因为它违反了 Python 的禅宗:

显式优于隐式。

坦率地说,一个for循环的多行并不多。

于 2013-06-03T01:43:35.563 回答
1

您可以使用map. 它通常用于创建第二个列表,并将返回该值,但您可以忽略它。

map(lambda x: x.foo(), objects)
于 2013-06-03T01:43:29.137 回答
0

使用numpy 向量化!它将为您完美工作!

from numpy import np
def fun(x):
    #do something
array = np.array(your_list)
vectfun = np.vectorize(fun)
answer = vectfun(array)

所以现在答案将是一个结果数组,其中包含上一个列表中的所有项目,并应用了函数!这是一个例子:

>>> your_list = [1,2,3,4,5]
>>> def fun(x):
...     return x**x
... 
>>> array = np.array((your_list))
>>> vectfun = np.vectorize(fun)
>>> answer = vectfun(array)
>>> answer
array([   1,    4,   27,  256, 3125])
于 2013-06-03T02:36:15.520 回答