Python 如何将此代码更改为oop格式,以便可以重用代码

Python 如何将此代码更改为oop格式,以便可以重用代码,python,oop,Python,Oop,这是我想做的。如您所见,此代码获取1个csv文件并从中创建4个列表。现在,我可以并且将对这些列表进行数学运算,比如data1[4]-data2[30] 但我也有一些其他文件,我也想从中创建列表。但我希望能够像上面看到的数学一样重用代码(data1[4]-data2[30])。因此,理想情况下,包括数组在内的所有文件都应该为其他文件命名为相同的名称 我对编程非常陌生,所以这被证明有点困难。很明显,所有东西的名字都是一样的,我不希望这样。因此,通过oop,我希望能够重新使用我的数学逻辑,而不必复制大

这是我想做的。如您所见,此代码获取1个csv文件并从中创建4个列表。现在,我可以并且将对这些列表进行数学运算,比如
data1[4]-data2[30]

但我也有一些其他文件,我也想从中创建列表。但我希望能够像上面看到的数学一样重用代码(
data1[4]-data2[30]
)。因此,理想情况下,包括数组在内的所有文件都应该为其他文件命名为相同的名称

我对编程非常陌生,所以这被证明有点困难。很明显,所有东西的名字都是一样的,我不希望这样。因此,通过oop,我希望能够重新使用我的数学逻辑,而不必复制大量的数学算法和重命名所有内容

显然,我不想只对这4个数组进行计算,保存结果并更改文件名。不,在我的程序中,所有东西都必须同时工作

我希望我能得到一些关于如何做到这一点的提示。我试图扩大我关于oop工作原理的知识范围,但事实证明这很困难。我想最好能得到一个关于如何解决我自己问题的解释


总而言之,我从一个文件创建了4个列表。我想从不同的文件中创建4个附加列表,但数组的名称相同。然后我只需要做一次大规模的数学计算,让它对所有事情都有效。并使其适用于我的程序中引入的任何未来新数据。

如果您想要一个数据容器,可以通过使用适当的构造函数创建一个类(init方法)。下面是从两个文件加载数据的示例

import csv

datafile = csv.reader(open('datafile.csv','rb'), delimiter=",", quotechar='|')
date, data1, data2, data3 = [], [], [], []

for row in datafile:
    date.append(row[0])
    data1.append(row[1])
    data2.append(row[2])
    data3.append(row[3])

如果你想应用方法(你描述的数学知识),你可能想把这些方法放在课堂上,你能给出一些更具体的例子来说明你想做什么吗?

首先,你一定要做面向对象的而不是过程的吗?您可以将其中的大部分放在一个函数中,然后返回一个包含列表的元组(是的,这有点像python允许您从一个函数返回多个值的方式)

OOP版本类似于@mike vella的答案

按照程序,你可以写:

import csv

datafile1 = csv.reader(open('datafile1.csv','rb'), delimiter=",", quotechar='|')
datafile2 = csv.reader(open('datafile2.csv','rb'), delimiter=",", quotechar='|')


class data(object):

    def __init__(self,data_file):

        self.date, self.data1, self.data2, self.data3 = [], [], [], []

        for row in data_file:
            self.date.append(row[0])
            self.data1.append(row[1])
            self.data2.append(row[2])
            self.data3.append(row[3])


data1 = data(datafile1)
data2 = data(datafile2)
问题:是否要将每个连续文件的数据附加到相应的列表中?我想是的,因为您使用了
append

import csv

def get_datagroup(data):
    # data is the filename = 'datafile.csv'
    datafile = csv.reader(open(data,'rb'), delimiter=",", quotechar='|')
    date, data1, data2, data3 = [], [], [], []

    for row in datafile:
        date.append(row[0])
        data1.append(row[1])
        data2.append(row[2])
        data3.append(row[3])

    return (date, data1, data2, data3)

datagroup1 = get_datagroup('datafile1.csv')
datagroup2 = get_datagroup('datafile2.csv')
您可以通过执行以下操作使其递归:

import csv

def get_datagroup(data, data_tuples):
    # data is the filename = 'datafile.csv'
    # data_tuples holds date, data1,2,3
    datafile = csv.reader(open(data,'rb'), delimiter=",", quotechar='|')

    # you can use: data_tuples[0], data_tuples[1], data_tuples[2], data_tuples[3]
    # instead of : date,           data1,          data2,          data3
    date, data1, data2, data3 = data_tuples

    for row in datafile:
        date.append(row[0])
        data1.append(row[1])
        data2.append(row[2])
        data3.append(row[3])

    return (date, data1, data2, data3)

#initially, data tuples are empty
datagroup1 = get_datagroup('datafile1.csv', ([], [], [], []))
#then pass each subsequent call the last call's result tuple
#so that datagroup2 will have the results of datagroup1 and the new stuff
datagroup2 = get_datagroup('datafile2.csv', datagroup1)

我在尝试您的代码时了解到了这一点:“AttributeError:'data'对象没有属性'date'”,但我确信它几乎是正确的。基本上,我想做的是选择一个日期,搜索该日期,并在日期列表中获取其索引。那么我就以这个数字作为起点。从那里我计算了各种各样的数据,比如数组最后20天的平均值,或者其他计算的结果等等。但主要的一点是,在做了数学运算之后,第二天再去计算所有的东西。并对所有代码行执行此操作。并保存结果。在行
date、data1、data2、data3=[]、[]、[]、[]、[]、[]
中添加
self。
如下所示<代码>self.date,self.data1,self.data2,self.data3=[],[],[],[],[]@Mike Btw Mike我忘了说谢谢了!所以,谢谢你们,顺便说一句,你们所处的领域很酷。但为了让它更有意义,基本上我只是在列表中选择一个起点。从那以后,我只做了20个列表点,做各种各样的数学。当一切都完成后,我开始选择一个新的列表索引位置。我认为你的解决方案是完美的。我会用方法来计算。我想我不需要更多的帮助了。谢谢:)。不客气-@aneroid-谢谢你的更正,代码是“经过验证但未经测试的”。在这之前,我根本没有使用任何方法。我现在明白了,这不仅仅是OOP的一部分,而且一开始我确实是这么想的。你的解决方案看起来也很好!但无论我选择哪种方式(我还不确定),这肯定让我对如何使用方法编程有了更好的了解。谢谢你!为了回答您的问题,您的猜测非常符合逻辑,我本应该解释得更好,但答案实际上是否定的。其他文件将具有不同的数据,但日期相同,因此我希望将它们与其他数据一起查看。@aneroid我认为OOP方法非常适合这种情况,如果仅仅是因为他的代码开始变得更复杂,OOP方法就会让一切变得更直观。@Mikevela可能,但到目前为止,他没有使用(也不需要使用)任何其他OOP原则——继承、obj方法、obj属性等。只需使用
\uu init\uuuuu
他就拥有了所有需要的功能。如果他在同一个类中添加其他函数来进行比较、分析等,那么OOP肯定会有好处。但对于这个简单的方法,程序方法更好。(一般来说,我不赞成也不反对,只是在这种情况下哪个更合适。)当然,他确实要求“将此代码更改为OOP格式”,所以您的解决方案更适合他的问题。我提供了一个替代方案,同时仍然根据需要提供封装的/可重复的/可调用的代码。
datagroup = ([], [], [], [])
datagroup = get_datagroup('datafile1.csv', datagroup)
datagroup = get_datagroup('datafile2.csv', datagroup)
datagroup = get_datagroup('datafile3.csv', datagroup)