我有一个像这样工作的算法(在伪代码中):
def func_1(x):
apply processing 1 to x
return x
def func_2(x):
apply processing 2 to x
return x
def func_3(x):
apply processing 3 to x
return x
我想编写一个函数func_all_processing(data, execution_order)
,以定义的顺序将所有这些函数应用于某些输入数据并输出处理后的数据,例如:
func_all_processing(data, [1,2,3])
会做:
processed_data = func_1(data)
processed_data = func_2(processed_data)
processed_data = func_3(processed_data)
return processed_data
而
func_all_processing(data, [3,1,2])
会做:
processed_data = func_3(data)
processed_data = func_1(processed_data)
processed_data = func_2(processed_data)
return processed_data
正确的方法是什么?
将函数放在一个列表中,并将该列表传递给func_all_processing()
,后者循环访问它们。
def func_all_processing(data, funcs):
for f in funcs:
data = f(data)
return data
print(func_all_processing(data, [func_1, func_2, func_3]))
如果要测试所有不同的顺序,请使用itertools.permutations()
遍历不同的排列。
你可以做:
def process_all(x,process_order:list):
data = x
for process in process_order:
processed_date = globals()["func_{}".format(process.__str__())](data)
data = processed_date
return processed_date
如@Bamar所示,我将使用函数列表,并将函数封装在func_all_processing函数中,如下所示:
def func_all_processing(data: [int, float], order: list) -> object:
def func_1(x):
apply processing 1 to x
return x
def func_2(x):
apply processing 2 to x
return x
def func_3(x):
apply processing 3 to x
return x
func_list = [func_1, func_2, func_2]
rslt = data
for i in order:
rslt = func_list[i](rslt)
return rslt