【问题标题】:Avoiding redundancy when working with multiple similar functions使用多个类似功能时避免冗余
【发布时间】:2019-11-05 15:10:49
【问题描述】:

这个问题可能听起来完全愚蠢,但由于我对此类问题的经验为 0,所以我相信这可能值得一试。

我面临的情况是我有多个函数,每个函数调用一个数据帧,然后再创建几个数据帧来执行一些操作。是的,我也许可以使用 OOP,但我认为这不会使我的具体情况更具可读性。

下面的代码是我制作的一个示例,可以将我的意思可视化,它除了说明问题之外没有任何目的。当然,我面临的情况更复杂,涉及更多的数据帧,这就是为什么将变量分配给每个分区数据帧并将其用作函数的参数不是一种选择。

dfdata = pd.DataFrame({'Column A': [300,300,450,500,500,750,600,300, 150],'Column B': [1,1,0,1,0,1,0,0,1],'Column C': ['R','C','R','C','Q','C','R','Z','Z']})

def foo1(df):
    df_1 = df.loc[df['Column B'] == 1]
    df_0 =df.loc[df['Column B'] == 0]
    df_x = df_1['Column B']*2
    return df_x

def foo2(df):
    df_1 = df.loc[df['Column B'] == 1]
    df_0 =df.loc[df['Column B'] == 0]
    df_y = df_0['Column B']*2
    return df_y

def foo3(df):
   df_1 = df.loc[df['Column B'] == 1]
   df_0 =df.loc[df['Column B'] == 0]
   df_z = df_1['Column B']*3
   return df_z

所以,总而言之,有什么想法可以在不应用 OOP 的情况下让事情变得更少重复和更智能?

【问题讨论】:

  • 为什么不想应用 OOP?
  • 您的代码没有多大意义。由于您的df_1 的构造,它的Column B 在每一行(在您的每个foo 函数中)始终只包含1。因此,df_1['Column B']*3 有点过于复杂了。此外,foo1()foo2() 是相等的。所以很可能,你的代码有问题,根本没有做你想做的事。你能描述一下你真正想在你的函数中实现什么吗?
  • @jonathan.scholbach 是的,这确实很奇怪。正如我在这里提到的那样:“下面的代码是我制作的一个示例,可以很有趣地可视化我的意思,它除了说明问题之外没有任何其他目的。”

标签: python dry readability code-organization


【解决方案1】:

您正在寻找避免或消除代码中重复的方法,这很好。实际上,这是编程中一个非常重要的原则,它甚至有自己的缩写:DRY(如 "Don't Repeat Y我们自己”)。你是对的,这与面向对象编程无关。 :)

当试图摆脱重复时,识别重复代码的变量部分通常是一个很好的策略,即每个代码中不同的部分否则重复的代码块。然后尝试编写接受这些变量作为参数的函数。这样您概括您的函数,并且您将参数化版本识别为更通用函数的特例。例如,使用您的示例,保留其中没有多大意义的部分:

def foo(df, column_name="Column B", factor=2, filter_value=1):
    df_1 = df.loc[df[column_name] == filter_value]
    return df_1[column_name] * factor

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2017-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多