我正在寻找一个过程的名称,该过程处理其他几个函数中一个函数的输出(试图为我的问题找到更好的词)。一些伪/实际代码会非常有帮助。
我编写了以下代码:
def read_data():
read data from a file
create df
return df
def parse_data():
sorted_df = read_data()
count lines
sort by date
return sorted_df
def add_new_column():
new_column_df = parse_data()
add new column
return new_column_df
def create_plot():
plot_data = add_new_column()
create a plot
display chart
我想要理解的是如何跳过一个函数,例如创建以下链read_data() -> parse_data() -> create_plot()
。
正如代码现在看起来的那样(由于所有返回值以及它们在函数之间传递的方式),它需要我更改最后一个函数 create_plot()
中的输入数据。
我怀疑我创建了逻辑上不正确的代码。
有什么想法吗?
原始代码:
import pandas as pd
import matplotlib.pyplot as plt
# Read csv files in to data frame
def read_data():
raw_data = pd.read_csv('C:/testdata.csv', sep=',', engine='python', encoding='utf-8-sig').replace({'{':'', '}':'', '"':'', ',':' '}, regex=True)
return raw_data
def parse_data(parsed_data):
...
# Convert CreationDate column into datetime
raw_data['CreationDate'] = pd.to_datetime(raw_data['CreationDate'], format='%Y-%m-%d %H:%M:%S', errors='coerce')
raw_data.sort_values(by=['CreationDate'], inplace=True, ascending=True)
parsed_data = raw_data
return parsed_data
raw_data = read_files()
parsed = parsed_data(raw_data)
最佳答案
传递数据而不是仅仅有效地“嵌套”所有内容。理想情况下,函数所需的任何数据都应作为参数传递给函数:
def read_data():
read data from a file
create df
return df
def parse_data(sorted_df):
count lines
sort by date
return sorted_df
def add_new_column(new_column_df):
add new column
return new_column_df
def create_plot(plot_data):
create a plot
display chart
df = read_data()
parsed = parse_data(df)
added = add_new_column(parsed)
create_plot(added)
尝试确保函数只处理它们直接负责的事情。知道数据来自哪里或生成数据不是 parse_data
的工作,因此它不应该担心这一点。让调用者处理它。
我在这里设置的方式通常称为“管道”或“线程”。信息从一个功能“流动”到下一个功能。在像 Clojure 这样的语言中,可以写成:
(-> (read-data)
(parse-data)
(add-new-column)
(create-plot))
使用线程宏->
,使您无需手动处理数据传递。不幸的是,Python 没有内置任何东西来执行此操作,尽管可以使用 external modules 来实现。 .
另请注意,由于数据帧似乎是可变的,因此您实际上不需要从函数中返回更改后的数据帧。如果您只是直接改变参数,则可以按顺序将相同的数据帧传递给每个函数,而不是将其放置在诸如 parsed
和 added
之类的中间变量中。我在这里展示的方式是设置的通用方式,但可以根据您的具体用例进行更改。
关于python - 不同函数之间的链接输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58473775/