我有一个Pandas数据框,想要用它做不同的事情。现在我的函数有这个结构:
def process_dataframe(df, save_to_file, print_to_screen, etc):
...
if save_to_file:
df.to_csv(filename)
elif print_to_screen:
print df
elif...
这是一个丑陋的if else案例。我想用功能代替。一个函数指针。像这样的东西。我创建了几个函数:
def save_to_file(df, filename):
return create_function(to_csv, filename???)
def print_to_screen(df):
return create_function(print)
这意味着我可以将我的函数结构改为这一行:
result = process_dataframe(save_to_file)
...
...
def process_dataframe(df, my_functional):
return my_functional(df)
问题是我不懂语法。例如,如何在“save_to_file()”中返回类成员函数“.to_csv”? “save_to_file()”如何?它需要哪个args?
当然,我可以使用lambda而不是定义每个函数。但我想先了解如何定义函数。使用lambdas的下一步,我可以弄清楚自己。
答案 0 :(得分:1)
我确定这实际上是你想要做的,但假设它是,你可以编写一个调用函数的函数(并通过参数传递),如下所示:
def process_df(df, function, *args, **kwargs):
function(df, *args, **kwargs)
定义你的两个动作。
def print_to_screen(df):
print df
def save_to_file(df, filename):
df.to_csv(filename)
然后你可以随意使用它们:
In [193]: df = pd.DataFrame([[1,2,3],[2,4,5]], columns=['a','b','c'])
In [197]: process_df(df, print_to_screen)
a b c
0 1 2 3
1 2 4 5
In [198]: process_df(df, save_to_file, 'temp.csv')
#writes temp.csv
答案 1 :(得分:0)
问题是我不懂语法。例如,如何 返回“save_to_file()?”
中的类成员函数“.to_csv”
我认为你问的是:
def save_to_file(filename):
def df_to_csv(df):
return df.to_csv(filename)
return df_to_csv
电话:
foo = save_to_file('myfile.csv')
foo(df) # <- here "df" will be saved to "myfile.csv"
您也可以这样做(我认为这是您最初想要的):
def save_to_file(df, filename):
def df_to_csv():
return df.to_csv(filename)
return df_to_csv
然后这样称呼它:
foo = save_to_file(df, 'myfile.csv')
foo() # <- "df" is saved to "myfile.csv"
但对我来说,这似乎并不比第一个解决方案难看,所以你可能想重新考虑一下你的方法。