我有一个 python 函数,它有一个数据框和参数,它是 function1(df, 'A') 或 function1(df, 'A, B, C')。我还有其他 3 个函数 FunctionA(df_A)、FunctionB(df_B)、FunctionC(df_C) df_A、df_B、df_C 是从函数 1 传递的数据帧的参数。
如果function1中传递的参数具有值A,我需要调用FunctionA,类似地,如果function1中传递的参数具有值B,则FunctionB。
如果所有 3 个值(A、B、C)都在 Function1 中传递,那么我需要以相同的顺序执行 FunctionA,然后是 FunctionB,然后是 FunctionC,并使用相同的数据帧。从 FunctionA 返回的数据帧将成为 FunctionB 的输入,然后是 FunctionC 的输入。
如果参数的顺序改变了,如果是(B,A,C)那么,function1会先调用FunctionB,然后FunctionB返回的dataframe会成为FunctionA的输入,然后是FunctionC的输入,最后会有o/p从 FunctionC 返回。
所以,问题是有没有一种有效的方法来处理它使用 python A、B、C 或 A、C、B 或 B、A、C 或 B、C、A 或 C、A、B 或 C 的所有可能组合,乙,甲?我想减少处理这些情况的 if 语句的数量。如果传递的参数数量增加到 4 个,比如 A、B、C、D,那么 if 语句会爆炸到更大的数量。有没有办法以有效的方式处理这种情况?请建议。
functionA(df_A):
print("inside A")
# just for example I am doing something here
df_A.reset_index(drop=True, inplace=True)
return df_A
functionB(df_B):
print("inside B")
# just for example I am doing something here
df_B.reset_index(drop=True, inplace=True)
return df_B
functionB(df_C):
print("inside C")
# just for example I am doing something here
df_C.reset_index(drop=True, inplace=True)
return df_C
def function1(df, seq_abc):
r = [x.strip().lower() for x in seq_abc.split(',')]
if r[0] == 'A' and r[1] == 'B' and r[2] == 'C':
df = functionA(df)
df = functionB(df)
df = functionC(df)
print("A then B then C executed!")
if r[0] == 'A' and r[1] == 'C' and r[2] == 'B':
df = functionA(df)
df = functionC(df)
df = functionB(df)
print("A then C then B executed!")
if r[0] == 'B' and r[1] == 'C' and r[2] == 'A':
df = functionB(df)
df = functionC(df)
df = functionA(df)
print("B then C then A executed!")
returned_value = function1(df, "A,B,C") # the function1 will call FunctionA or B or C based on parameter passed.
print(returned_value)
正如常说的:
所以你可以发送一个包含对要运行的函数的引用的数组
def function1(df, funcs):
for f in funcs:
f(df)
functions_to_run = [functionA, functionC]
function1(df, functions_to_run)
如何处理参数取决于函数应该具有相同的参数还是不同的参数。如果是后者,您可以传入带有附加参数的部分函数。
将函数作为参数传递的另一种方法是传递值,然后在函数内有一个字典,将参数值映射到特定函数。
def function1(df, labels):
func_map = {
'A': functionA,
'B': functionB,
'C': functionC
}
for label in labels:
func_map[label](df)
# Call with array of labels - in specific order
function1(df, ['A','C','B'])
# Since a string is iterable you could also do this
function1(df, 'ACB')
与此处函数的参数相同的推理。这一切都取决于您想要实现的目标。请注意,由于
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句