【七】定制数据对象
一:编写程序
现如今有一组新的秒表数据,需要对其数据进行提取
sarah.txt
sara,2002-9-9,2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55
1.将sarah.txt中的名字与成绩打印出来(使用读取文件的方式)
#coding=utf-8 #打印出秒表数据的姓名与前三列的成绩 def get_file(filename): try: with open(filename) as f: data=f.readline().strip().split(",") return data except IOError as e: raise e def qxsj(time_string): if "-" in time_string: splitter="-" elif ":" in time_string: splitter=":" else: return time_string (fen,miao)=time_string.strip().split(splitter) return(fen+"."+miao) open_file=get_file("D:\pydj\sarah.txt") #移除前两列的数据 user_name,user_sr=open_file.pop(0),open_file.pop(0) print(open_file) print(user_name,user_sr) print(user_name+"’fastest times are:"+str(sorted(set([qxsj(i) for i in open_file]))[0:3]))
打印结果:
完善代码思路:
- 一次性完成字典的创建
- 把字典创建代码一到get_file()函数中,返回一个字典而不是列表
- 把确定各个选手的3个最快时间的代码移到get_file()函数中
- 调整主代码中的函数调用,调用这个新版本的get_file()函数来支持新的操作模式
mikey.txt
mikey test,2000-2-2,2:22,3.01,3:01,3.02,3:02,3.02,3:22,2.49,2:38
2.将sarah.txt中的名字与成绩打印出来(使用字典的方式)
#coding=utf-8 def get_file(filename): try: with open(filename) as f: data=f.readline().strip().split(",") #返回一个字典,字典中将各个数据提取出来 return({ "Name":data.pop(0), "DOB":data.pop(0), "Times":str(sorted(set([qxsj(i) for i in data]))[0:3]) }) except IOError as e: raise e def qxsj(time_string): if "-" in time_string: splitter="-" elif ":" in time_string: splitter=":" else: return time_string (fen,miao)=time_string.strip().split(splitter) return(fen+"."+miao) #sarch的记录 sarch_file=get_file("D:\pydj\sarah.txt") print(sarch_file["Name"]+"’fastest times are:"+sarch_file["Times"]) #mikey的记录 mikey_file=get_file("D:\pydj\mikey.txt") print(mikey_file["Name"]+"’fastest times are:"+mikey_file["Times"])
打印结果:
C:\Python27\python.exe D:/pydj/ex5.py sara’fastest times are:['2.18', '2.25', '2.39'] mikey test’fastest times are:['2.22', '2.38', '2.49'] Process finished with exit code 0
二:使用class定义类
创建对象实例
a=Athlete() b=Athlete() c=Athlete() d=Athlete()
- 小括号告诉python要创建一个新的“Athlete”对象,然后复制给一个变量
- 所有这些变量都是唯一的,类型都是Athlete
self的重要性
每个方法的第一个参数都是self
#定义一个a类 In [20]: class a: ...: def __init__(self,a_name,a_dob=None,a_times=[]): ...: self.name=a_name ...: self.dob=a_dob ...: self.times=a_times ...: #实例化该类 In [21]: sarah=a("sarah","200-2-2",["2:55","2.3","9-6"]) #查看sarah的类型,为a类 In [22]: type(sarah) Out[22]: __main__.a In [23]: sarah Out[23]: <__main__.a at 0x7f2df2262a20> In [24]: sarah.name Out[24]: 'sarah' In [25]: sarah.dob Out[25]: '200-2-2' In [26]: sarah.times Out[26]: ['2:55', '2.3', '9-6']
3.将sarah.txt中的名字与成绩打印出来(使用类的方式)
#coding=utf-8 #编写代码来定义Athlete类 #除了__init__()方法外,还要定义一个新方法top3(),调用这个方法会返回最快的3个时间 #要调整dakaiwenjian()函数,返回Athlete对象而不是字典 class Athlete: def __init__(self,a_name,a_dob=None,a_times=[]): self.name=a_name self.dob=a_dob self.times=a_times def top3(self): return str(sorted(set([fenge(i) for i in self.times]))[0:3]) def dakaiwenjian(filename): try: with open(filename,"r") as f: data=f.readline().strip().split(",") return(Athlete(a_name=data.pop(0),a_dob=data.pop(0),a_times=data)) except IOError as e: raise e def fenge(time_string): if "-" in time_string: splitter="-" elif ":" in time_string: splitter=":" else: return time_string (fen,miao)=time_string.strip().split(splitter) return(fen+"."+miao) #sarch的记录 sarch_file=dakaiwenjian("D:\pydj\sarah.txt") print(sarch_file.name+"’fastest times are:"+sarch_file.top3()) #mikey的记录 mikey_file=dakaiwenjian("D:\pydj\mikey.txt") print(mikey_file.name+"’fastest times are:"+mikey_file.top3())
打印结果:
C:\Python27\python.exe D:/pydj/ex8.py sara’fastest times are:['2.18', '2.25', '2.39'] mikey test’fastest times are:['2.22', '2.38', '2.49'] Process finished with exit code 0
4.向你的类增加两个方法,一个为add_time(),将一个额外的计时值追加到选手的计时数据。第二个方法add_times()会用一个或多个计时值(提供一个列表)来扩展一个选手的计时数据
#coding=utf-8 class Athlete: def __init__(self,a_name,a_dob=None,a_times=[]): self.name=a_name self.dob=a_dob self.times=a_times #前三名成绩 def top3(self): return str(sorted(set([fenge(i) for i in self.times]))[0:3]) #为选手增加一个秒表时间 def add_time(self,time_value): self.times.append(time_value) #为选手增加一个列表的秒表时间 def add_times(self,list_of_times): self.times.extend(list_of_times) def dakaiwenjian(filename): try: with open(filename,"r") as f: data=f.readline().strip().split(",") return(Athlete(a_name=data.pop(0),a_dob=data.pop(0),a_times=data)) except IOError as e: raise e def fenge(time_string): if "-" in time_string: splitter="-" elif ":" in time_string: splitter=":" else: return time_string (fen,miao)=time_string.strip().split(splitter) return(fen+"."+miao) #sarch的记录 sarch_file=dakaiwenjian("D:\pydj\sarah.txt") #为sarch增加一个秒表时间 sarch_file.add_time("1.11") print(sarch_file.name+"’fastest times are:"+sarch_file.top3()) #mikey的记录 mikey_file=dakaiwenjian("D:\pydj\mikey.txt") print(mikey_file.name+"’fastest times are:"+mikey_file.top3())
打印结果:
C:\Python27\python.exe D:/pydj/ex8.py
sara’fastest times are:['1.11', '2.18', '2.25']
mikey test’fastest times are:['2.22', '2.38', '2.49']
Process finished with exit code 0
三:继承类
5.继承python内置的list
In [28]: class Namelist(list): ...: def __init__(self,a_name): ...: list.__init__([]) ...: self.name=a_name ...: #实例化类 In [29]: huahua=Namelist("qwe") In [30]: type(huahua) Out[30]: __main__.Namelist #该实例的方法 In [31]: dir(huahua) Out[31]: ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'name', 'pop', 'remove', 'reverse', 'sort'] In [32]: huahua Out[32]: [] #append方法 In [33]: huahua.append("one") In [34]: huahua Out[34]: ['one'] #extend方法 In [35]: huahua.extend(["two","three"]) In [36]: huahua Out[36]: ['one', 'two', 'three']
6.把原有的Athlete类的代码删除,写一个新的Atheletelist类,让它继承内置的list类,然后进行测试
#coding=utf-8 class Athletelist(list): def __init__(self,a_name,a_dob=None,a_times=[]): list.__init__(self) self.name=a_name self.dob=a_dob #因为该类继承了list,所以不需要将a_times在重新赋值,直接将a_times,extend self.extend(a_times) #前三名成绩 def top3(self): return str(sorted(set([fenge(i) for i in self]))[0:3]) def dakaiwenjian(filename): try: with open(filename,"r") as f: data=f.readline().strip().split(",") return(Athletelist(a_name=data.pop(0),a_dob=data.pop(0),a_times=data)) except IOError as e: raise e def fenge(time_string): if "-" in time_string: splitter="-" elif ":" in time_string: splitter=":" else: return time_string (fen,miao)=time_string.strip().split(splitter) return(fen+"."+miao) #sarch的记录 sarch_file=dakaiwenjian("D:\pydj\sarah.txt") #为sarch增加一个秒表时间 print(sarch_file.name+"’fastest times are:"+sarch_file.top3()) #mikey的记录 mikey_file=dakaiwenjian("D:\pydj\mikey.txt") print(mikey_file.name+"’fastest times are:"+mikey_file.top3())
打印结果:
C:\Python27\python.exe D:/pydj/ex8.py sara’fastest times are:['2.18', '2.25', '2.39'] mikey test’fastest times are:['2.22', '2.38', '2.49'] Process finished with exit code 0