Как избежать избыточности при работе с несколькими похожими функциями - PullRequest
0 голосов
/ 05 ноября 2019

Этот вопрос может звучать совершенно глупо, но, поскольку у меня 0 опыта с такой проблемой, то я думаю, что, возможно, стоит попытаться его задать.

Ситуация, с которой я сталкиваюсь, заключается в том, что у меня есть несколько функций, и каждая из них вызывает один фрейм данных, а затем создает еще несколько фреймов данных для выполнения некоторых операций. Да, я мог бы использовать, возможно, ООП, однако я не думаю, что это сделало бы вещи более читабельными для моего конкретного случая.

Код, приведенный ниже, является примером, который я сделал, который может быть интересным для визуализации того, что я имею в виду,на самом деле это не имеет никакой иной цели, кроме иллюстрации проблемы. Естественно, ситуация, с которой я сталкиваюсь, является более сложной и включает в себя гораздо больше фреймов данных, поэтому присвоение переменной каждому разделенному фрейму данных и использование ее в качестве аргумента функции не вариант.

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

Итак,Подводя итог, есть идеи, как сделать вещи менее повторяющимися и умнее без применения ООП?

1 Ответ

2 голосов
/ 05 ноября 2019

Хорошо, что вы ищете способы избежать или удалить повторения в вашем коде. На самом деле, это очень важный принцип в программировании, который даже получил свое собственное сокращение: DRY (как в « D on't R epeat Y ourself»),И вы правы, это не имеет ничего общего с объектно-ориентированным программированием. :)

При попытке избавиться от повторений, как правило, хорошей стратегией является выявление переменных частей повторяющегося кода, то есть частей, которые отличаются вкаждый из ваших в противном случае повторяющихся блоков кода. Затем попробуйте написать функции, которые принимают эти переменные в качестве параметров. Таким образом, вы обобщаете свои функции и определяете параметризованную версию как частный случай более общей функции. Например, работая с вашим примером, сохраняя части, которые не имеют в нем особого смысла:

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
...