• 第六章:定制数据对象


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

  • 相关阅读:
    Python-zip压缩-解压
    使用zabbix监控nginx
    原已经安装好的nginx,现在需要添加一个未被编译安装的模块:
    zabbix 邮件告警配置
    lnmp-zabbix
    Mysql新建用户和数据库并授权
    git标签管理
    Ubuntu下安装tomcat
    git分支管理
    Java拦截器
  • 原文地址:https://www.cnblogs.com/minseo/p/7423724.html
Copyright © 2020-2023  润新知