Python定制数据对象

向数据文件中增加了一些其他的标识数据之后,使用数据字典将数据与单个的变量相关联

def openFile (fn):
    try:
        with open(fn, "r") as file:
            file_data = file.readline()
        return file_data.strip().split(",")
    except IOError as error:
        print("文件不存在:" + str(error))
        return None
def sanitize (time_string):
    if "-" in time_string:
        splitter = "-"
    elif ":" in time_string:
        splitter = ":"
    else:
        return time_string
    (mins, second) = time_string.split(splitter)
    return (mins + "." + second)


james_data = chapter6.OpenFile.openFile("james2.txt")
# 创建数据字典,将数据与键相关联,用键作为索引访问不同类型的数据
james = {}
james["Name"] = james_data.pop(0)
james["Dob"] = james_data.pop(0)
# print(james["Dob"])
james["Time"] = james_data
# print(james["Time"])
print(james["Name"] + '的最快的三个时间是:' + str(sorted(set(chapter6.sanitize.sanitize(each_data) for each_data in james["Time"]))[0:3]))
# 用数据字典实现julie的最快的三个时间
julie_data = chapter6.OpenFile.openFile("julie2.txt")
# 创建空字典的第二种方法
julie = dict()
julie["Name"] = julie_data.pop(0)
julie["Dob"] = julie_data.pop(0)
julie["Time"] = julie_data
julie_test = sorted(set(chapter6.sanitize.sanitize(each_data) for each_data in julie["Time"]))
print(julie["Name"] + "的最快的三个时间是" + str(julie_test[0:3]))

结果:


将读取数据和创建数据字典封装在一个函数中,让函数返回一个已经填充的字典,把获取前三个时间的代码也封装在函数中

def creatDict (fn):
    try:
        with open(fn, "r") as file:
            file_data = file.readline()
        file_clean = file_data.strip().split(",")
        return {"Name": file_clean.pop(0), "Dob": file_clean.pop(0), "Time": str(sorted(set(chapter6.sanitize.sanitize(each_data) for each_data in file_clean))[0:3])}
    except IOError as error:
        print("文件不存在" + str(error))
        return None

实现:

sarah = chapter6.CreatDict.creatDict("sarah2.txt")
print(sarah["Name"] + "最快的三个时间是:" + sarah["Time"])

结果:


将代码和数据打包在一个类中,定义一个Athlete 类,实现初始化数据方法和其他的一些增加数据和获取前三的方法

# 定义Athlete类,定义__init__方法和top3方法,方法的第一个参数是self
class Athlete:
    def __init__(self, name, dob=None, time=[]):
        # 类的每个属性前都要有self,将数据与实例关联
        self.name = name
        self.dob = dob
        self.time = time

    def top3(self):
        return sorted(set(chapter6.sanitize.sanitize(each_data) for each_data in self.time))[0:3]

    def add_time(self, time=None):
        return self.time.append(time)

    def add_times(self, times=[]):
        return self.time.extend(times)

重新调整获取文件内容的函数,返回的结果是一个Athlete对象

# 返回一个Athlete对象
def get_coach_data(fn):
    try:
        with open(fn, "r")as file:
            file_data = file.readline()
        file_clean = file_data.strip().split(",")
        return Athlete(file_clean.pop(0), file_clean.pop(0), file_clean)
    except IOError as error:
        print("文件不存在:" + str(error))
        return None

实现:

# 定义一个类,定义方法,用get_coach_data方法实现mikey的最快的三个时间
mikey = chapter6.GetData.get_coach_data("mikey2.txt")
print(mikey.name + "最快的三个时间是:" + str(mikey.top3()))

结果:


在类中增加添加时间数据的方法并在测试代码中实现:

# 向mikey增加一个时间和时间列表
mikey.add_time('1.99')
print("更新后mikey最快的三个时间" + str(mikey.top3()))
mikey.add_times(['1.87', '2.21'])
print("再次更新后的mikey的最快的三个时间是:" + str(mikey.top3()))

结果:


继承内置的list,增加需要的属性

# 使用继承类实现Athlete的功能,继承内置的list类
class AthleteList(list):
    def __init__(self, name, dob=None, time=[]):
        list.__init__([])
        self.name = name
        self.dob = dob
        # 数据本身是时间数据,不需要time属性
        self.extend(time)

    def top3(self):
        return sorted(set(chapter6.sanitize.sanitize(each_data) for each_data in self))[0:3]

实例化一个对象,使用继承类实现

# 实例化一个Marry对象,使用继承类添加数据,并实现排序,返回时间最少的前三个时间
Marry = AthleteList('Marry Vi', '2013-10-29')
print(Marry.name)
print(Marry.dob)
# 继承内置的list,所以使用list的方法可以实现时间值的增加
Marry.append('1.32')
print(Marry.top3())
Marry.extend(['1.35', '1.90'])
print(Marry.top3())

结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值