第5章最后一个程序输出的正是这个教练想要的结果,但是还有一个缺陷:从这个输出无法判断是哪个选手的数据
Kelly认为他有办法,他已经向各个数据增加是标识数据
cat sarch2.txt
Sarah Sweeney,2002-6-17,2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55
第一个是选手名字,第二个是选手出生日期,需要输出选手名字和前三的成绩怎么处理
vim 176.py
#!/usr/bin/python # -*- coding:utf-8 -*- def sanitize(time_string): #定义函数如果字符串含有-和: if '-' in time_string: #均转换成. splitter = '-' elif ':' in time_string: splitter = ':' else: return (time_string) (mins,secs) = time_string.split(splitter) return(mins + '.' + secs) def get_coach_data(filename): #定义函数打开文件 try: with open(filename) as f: data = f.readline() return(data.strip().split(',')) #去掉空格回车生成列表作为返回值 except IOError as ioerr: print('File error:' + str(ioerr)) return(None) sarah = get_coach_data('sarah2.txt') (sarah_name,sarah_dob) = sarah.pop(0),sarah.pop(0) #删除列表第一个并且返回第一个字符串 print(sarah_name + "'s fastest times are:" + str(sorted(set([sanitize(t) for t in sarah]))[0:3]))
运行输出
下面使用字典来处理
vim 182.py
#!/usr/bin/python # -*- coding:utf-8 -*- def sanitize(time_string): #定义函数如果字符串含有-和: if '-' in time_string: #均转换成. splitter = '-' elif ':' in time_string: splitter = ':' else: return (time_string) (mins,secs) = time_string.split(splitter) return(mins + '.' + secs) def get_coach_data(filename): #定义函数打开文件 try: with open(filename) as f: data = f.readline() return(data.strip().split(',')) #去掉空格回车生成列表作为返回值 except IOError as ioerr: print('File error:' + str(ioerr)) return(None) sarah = get_coach_data('sarah2.txt') sarah_data = {} sarah_data['NAME'] = sarah.pop(0) sarah_data['DOB'] = sarah.pop(0) sarah_data['Times'] = sarah print(sarah_data['NAME'] + "'s fastest times are:" + str(sorted(set([sanitize(t) for t in sarah_data['Times']]))[0:3]))
输出是一样的
下面定义对象实例,首先创建一个名为Athlete的很小的类
vim 194.py
#!/usr/bin/python # -*- coding:utf-8 -*- class Athlete: def __init__(self,a_name,a_dob=None,a_time=[]): #定义类 self.name = a_name #初始化这三个属性,使用所提供的参数数据为3个类属性赋值 self.dob = a_dob self.times = a_time sarah = Athlete('Sarah Sweeney','2002-6-17',['2.58','2.58','1.56']) #创建两个唯一选手james使用省却参数 james = Athlete('James Jones') print(type(sarah)) print(sarah) print(sarah.name) print(sarah.times)
下面使用类来实现之前由函数实现的功能
vim 196.py
#!/usr/bin/python # -*- coding:utf-8 -*- def sanitize(time_string): #定义函数如果字符串含有-和: if '-' in time_string: #均转换成. splitter = '-' elif ':' in time_string: splitter = ':' else: return (time_string) (mins,secs) = time_string.split(splitter) return(mins + '.' + secs) 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(sorted(set([sanitize(t) for t in self.times]))[0:3]) def get_coach_data(filename): #定义函数打开文件 try: with open(filename) as f: data = f.readline() templ = data.strip().split(',') #去掉空格回车生成列表作为返回值 return(Athlete(templ.pop(0),templ.pop(0),templ)) except IOError as ioerr: print('File error:' + str(ioerr)) return(None) james = get_coach_data('james2.txt') julie = get_coach_data('julie2.txt') mikey = get_coach_data('mikey2.txt') sarah = get_coach_data('sarah2.txt') print(james.name + "'s fastest times are:" + str(james.top3())) print(julie.name + "'s fastest times are:" + str(julie.top3())) print(mikey.name + "'s fastest times are:" + str(mikey.top3())) print(sarah.name + "'s fastest times are:" + str(sarah.top3()))
向类增加两个方法.第一个名为add_time(),将一个额外的计时追加到选手的计时数据.第二个方法add_times()提供一个
列表追加时间
vim 200.py
#!/usr/bin/python # -*- coding:utf-8 -*- def sanitize(time_string): #定义函数如果字符串含有-和: if '-' in time_string: #均转换成. splitter = '-' elif ':' in time_string: splitter = ':' else: return (time_string) (mins,secs) = time_string.split(splitter) return(mins + '.' + secs) 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(sorted(set([sanitize(t) for t in self.times]))[0:3]) def add_time(self,time_value): self.times.append(time_value) #追加单个时间append方法 def add_times(self,list_of_times): self.times.extend(list_of_times) #列表追加多个时间extend方法追加列表 def get_coach_data(filename): #定义函数打开文件 try: with open(filename) as f: data = f.readline() templ = data.strip().split(',') #去掉空格回车生成列表作为返回值 return(Athlete(templ.pop(0),templ.pop(0),templ)) except IOError as ioerr: print('File error:' + str(ioerr)) return(None) vera = Athlete('Vera Vi') vera.add_time('1.31') print(vera.top3()) vera.add_times(['2.22','1.21','2.22']) print(vera.top3()) #测试新加方法的功能是否正常
Athlete类使用的list的方法,这些功能列表早就有了,Python允许从零可以创建一个定制类,也可以通过继承其他类
来创建一个类,通过继承创建的类为子类
vim 206.py
#!/usr/bin/python # -*- coding:utf-8 -*- class NameList(list): #提供一个类名新类派生list类 def __init__(self,a_name): list.__init__([]) #初始化所派生的类,然后把参数赋值至属性 self.name = a_name johnny = NameList("John Paul Jones") #创建一个新的NameList对象实例 print(type(johnny)) #johnny是一个NameList print(dir(johnny)) #johnny继承了list的方法 johnny.append("Base Player") johnny.extend(['Composer','Arranger','Musician'])#使用内置的方法为NameList追加数据 print(johnny) print(johnny.name)
下面修改之前的Athlete类,让它继承内置list类,将这个类命名为AthleteList
vim 208.py
#!/usr/bin/python # -*- coding:utf-8 -*- def sanitize(time_string): #定义函数如果字符串含有-和: if '-' in time_string: #均转换成. splitter = '-' elif ':' in time_string: splitter = ':' else: return (time_string) (mins,secs) = time_string.split(splitter) return(mins + '.' + secs) ''' 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(sorted(set([sanitize(t) for t 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) #列表追加多个时间 ''' class AthleteList(list): def __init__(self,a_name,a_dob=None,a_times=[]): list.__init__([]) self.name = a_name self.dob = a_dob self.extend(a_times) #数据本身是计时数据,所以不再需要times属性 def top3(self): return(sorted(set([sanitize(t) for t in self]))[0:3]) vera = AthleteList('Vera Vi') vera.append('1.31') print(vera.top3()) vera.extend(['2.22','1.21','2.22']) print(vera.top3()) #测试
修改之前代码使用继承类实现功能
vim 210.py
#!/usr/bin/python # -*- coding:utf-8 -*- def sanitize(time_string): #定义函数如果字符串含有-和: if '-' in time_string: #均转换成. splitter = '-' elif ':' in time_string: splitter = ':' else: return (time_string) (mins,secs) = time_string.split(splitter) return(mins + '.' + secs) class AthleteList(list): def __init__(self,a_name,a_dob=None,a_times=[]): list.__init__([]) self.name = a_name self.dob = a_dob self.extend(a_times) def top3(self): return(sorted(set([sanitize(t) for t in self]))[0:3]) def get_coach_data(filename): #定义函数打开文件 try: with open(filename) as f: data = f.readline() templ = data.strip().split(',') #去掉空格回车生成列表作为返回值 return(AthleteList(templ.pop(0),templ.pop(0),templ)) except IOError as ioerr: print('File error:' + str(ioerr)) return(None) james = get_coach_data('james2.txt') julie = get_coach_data('julie2.txt') mikey = get_coach_data('mikey2.txt') sarah = get_coach_data('sarah2.txt') print(james.name + "'s fastest times are:" + str(james.top3())) print(julie.name + "'s fastest times are:" + str(julie.top3())) print(mikey.name + "'s fastest times are:" + str(mikey.top3())) print(sarah.name + "'s fastest times are:" + str(sarah.top3()))