将函数附加到数组元素?

时间:2013-06-03 01:39:07

标签: python

有没有办法将函数(相同的函数)附加到数组的所有元素而不进行循环并逐个附加?

所以喜欢

# 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的值,而是在整个列表/数组上应用一个函数,每个元素都会执行该函数。

3 个答案:

答案 0 :(得分: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循环的另一行并不是那么多。

答案 1 :(得分:1)

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

map(lambda x: x.foo(), objects)

答案 2 :(得分:0)

使用numpy vectorize!它会很适合你!

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])