第六章:定制数据对象

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

原文地址:https://www.cnblogs.com/minseo/p/7423724.html