有没有办法将函数(相同的函数)附加到数组的所有元素而不进行循环并逐个附加?
所以喜欢
# 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的值,而是在整个列表/数组上应用一个函数,每个元素都会执行该函数。
答案 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])