第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()))
