0047 python中类的定义与用法

背景介绍

对混合型记录数据如:[James Lee,2002-3-14,2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22,2-01,2.01,2:16]进行数据分解,第一部分字母为姓名,第二部分为出生时间,第三部分为800m长跑的时间记录,但是对于计时部分,数据不一致,用了“-”和“.”和“:”三种符号来分割分钟和秒,因此需要做以下工作:

1,数据分解,将同类型数据归类

2,统一时间数据的格式为 分.秒 记录方式

3,去除重复的时间记录,并返回最快的前三个时间


数据

james2.txt=[James Lee,2002-3-14,2-34,3:21,2.34,2.45,3.01,2:01,2:01,3:10,2-22,2-01,2.01,2:16]

julie2.txt=[Julie Jones,2002-8-17,2.59,2.11,2:11,2:23,3-10,2-23,3:10,3.21,3-21,3.01,3.02,2:59]

mikey2.txt=[Mikey McManus,2002-2-24,2:22,3.01,3:01,3.02,3:02,3.02,3:22,2.49,2:38,2:40,2.22,2-31]

sarah2.txt=[Sarah Sweeney,2002-6-17,2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55,2:22,2-21,2.22]

运行环境:Python 3.4.0 (default, Apr 11 2014, 13:05:11)
[GCC 4.8.2] on linux
Type "copyright", "credits" or "license()" for more information.

代码:

'''定义一个函数sanitize(),将原始数据的分号和冒号都换成点号,实现数据的一致性'''
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)
'''定义一个类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(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()
        tmp = data.strip().split(',')            
        return(Athlete(tmp.pop(0),tmp.pop(0),tmp))
    except IOError as err:
        print('File Error:'+str(err))
        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()))

运行结果:

注意事项

1,在定义类时,注意def行中的冒号,另外在初始化函数(在python中时没有构造函数一说的)__init__()时,init的前后是两条下划线

2,类中定义无传入参数函数时也要带上self参数,self参数非常重要。

3,tmp = data.strip().split(',')

属于方法串链,从左向右进行;

sorted(set([sanitize(t) for t in self.times]))

属于函数串链,从右向左进行。

4,print(james.name + "'s fastest times are: "+ str(james.top3())),中的str()将参数内容强制转化成统一的字符串以便输出,不然会出现不能将列表转化为字符串的错误,因为前两个都是字母组成的字符串,而最后一个时数字组成的数据,要统一成字符串,因此加str()强制转化。

5, return(Athlete(tmp.pop(0),tmp.pop(0),tmp)) 中用pop(0)函数,第一次弹出最前面一项数据,弹出后就将其删除,下一项数据自然成为第一项。

6,代码中用到的函数解释:

split():按某个符号将字符串分解成几部分,如按逗号将[gend,lee,is,666]分解成四部分:split(',',3);

strip():去掉每一行的空白符,一般不带参数;

set():创建一个集合,自动忽略重复的内容,但创建的元素无序排列(也就是集合的特性:唯一性,无序性);

sorted():对一个字符串进行排序(默认升序,要降序则在sorted()参数中添加reverse=True),排序后的字符串赋给另个副本,不覆盖原始字符串;

     扩展:sort()进行原地排序,覆盖原来字符串内容;

取表中的前三项用:table[0:3],也就是table[0],table[1],table[2],不会包含3,python中的范围取左闭右开区间,如range(4)=0,1,2,3不含4。

补充:类的继承

如果利用继承类list,则相应部分代码为:

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])

相应的get_coach_data()函数中的返回修改为:

  return(AthleteList(tmp.pop(0),tmp.pop(0),tmp))


文章来源:《HeadFirstPython》,仅供学习参考。转载请注明文章出处:

http://blog.csdn.net/gendlee1991/article/details/51412676

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值