Python 如何使用相同的参数正确调用多个函数?

Python 如何使用相同的参数正确调用多个函数?,python,function,Python,Function,我有一些问题: 如何使用同一参数调用多个函数(101001000个函数) 举个例子: def function1(arg): return arg def function2(arg): return arg*2 def function_add_arg(arg): return np.sum(arg) def call_functions(values): result = (function1(values), function2(values), func

我有一些问题:

如何使用同一参数调用多个函数(101001000个函数)

举个例子:

def function1(arg):
return arg

def function2(arg):
    return arg*2

def function_add_arg(arg):
    return np.sum(arg)


def call_functions(values):

    result = (function1(values), function2(values), function_add_arg(values))
    return result

values = [1, 2, 3, 4]
result_tuple = call_functions(values)
如果我有1000个不同名称的函数呢?(功能_a、f2、add) 因此,您不能使用:

result = (eval(f'function_{i}({values})') for i in range(100))
我对这个例子的解决方案(不是最好的,只是为了展示我的想法):

但是如何正确地进行呢?(特别是如果我将调用更多函数)

不同的解决方案是使用**kwargs,函数列表除外

一些不同的、更好的解决方案?装饰师


问候

一种方法是将所有函数放在一个单独的文件中,并在末尾添加一行:

def f1(arg):
    ...
def f2(arg):
    ...
.
.
.
def fN(arg):
    ...

functions = {k:v for k,v in vars().items() if '__' not in k}
functions
变量将包含以前声明的所有函数的名称。我删除了以双下划线开头和结尾的内置变量,但您也可以筛选出所有函数都使用的前缀。
导入此文件还将导入可用于迭代并使用参数调用的变量。

您可以使用装饰器构建该函数列表:

function_list = []
def register(function):
    function_list.append(function)
    return function

@register
def function1(arg):
    return arg

@register
def function2(arg):
    return arg*2

...

您可以编写一个高阶函数来修复输入,并使返回值成为应用于该输入的函数的函数:

def fix_input(value):
    def apply(f):
        return f(value)
    return apply
用法如下:

def function1(arg):
    return arg

def function2(arg):
    return arg*2

def function_add_arg(arg):
    return sum(arg)

function_list = [function1, function2, function_add_arg]
values = [1, 2, 3, 4]

apply = fix_input(values)
print([apply(f) for f in function_list])
#[[1, 2, 3, 4], [1, 2, 3, 4, 1, 2, 3, 4], 10]

您还可以将
apply
map
一起使用,这样您就可以
map
将输入映射到函数列表上。从概念上讲,这就是您正在做的事情,但如果您想以这种方式将其明确化,这是一个品味问题。

为什么您会说您的解决方案不好?理解是正确的方法(可能使用列表理解,而不是用元组包装的生成器理解,但这就是我所要改变的)。如何决定列表中包含哪些函数?这将为您如何在不手动列出它们的情况下实现这一点设置规则-您的上一个解决方案似乎非常好。您可以有一个单独的模块/文件,其中包含所有应调用的函数,导入该模块并创建该模块中所有函数的列表。我更喜欢
def call\u函数(函数,值):return(函数中函数的函数(值)
。为什么要费心绑定
结果
,只在下一行返回它,为什么要绑定
元组
?让调用方决定如何处理iterable。另外,让你的
函数列表
有一个明确的参数(它实际上不需要是列表,所以可以叫它别的什么)。谢谢你的评论,@MatsLindh,在我写函数的时候,我可以决定。所以,和装饰师的解决方案对我来说很好。老实说,在调用“call_functions”之前,我可以从这个列表中删除一些函数。约翰克莱曼-你说得对。非常感谢。对我来说似乎很棒:)
def function1(arg):
    return arg

def function2(arg):
    return arg*2

def function_add_arg(arg):
    return sum(arg)

function_list = [function1, function2, function_add_arg]
values = [1, 2, 3, 4]

apply = fix_input(values)
print([apply(f) for f in function_list])
#[[1, 2, 3, 4], [1, 2, 3, 4, 1, 2, 3, 4], 10]