Python 如何使用相同的参数正确调用多个函数?
我有一些问题: 如何使用同一参数调用多个函数(101001000个函数) 举个例子: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
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]