使用一种有效的方式,根据给定顺序的参数调用 python 函数,以最大限度地减少 if-else 语句的使用

阿什维尼·斯里瓦斯塔瓦

我有一个 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)
林德罗斯

正如常说的:

Python 函数是一等公民

所以你可以发送一个包含对要运行的函数的引用的数组

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章