【七】定制数据对象

一:编写程序

现如今有一组新的秒表数据,需要对其数据进行提取

sarah.txt

sara,2002-9-9,2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55

 1.将sarah.txt中的名字与成绩打印出来(使用读取文件的方式)

#coding=utf-8
#打印出秒表数据的姓名与前三列的成绩
def get_file(filename):
    try:
        with open(filename) as f:
            data=f.readline().strip().split(",")
            return data
    except IOError as e:
        raise e
def qxsj(time_string):
    if "-" in time_string:
        splitter="-"
    elif ":" in time_string:
        splitter=":"
    else:
        return time_string
    (fen,miao)=time_string.strip().split(splitter)
    return(fen+"."+miao)
open_file=get_file("D:pydjsarah.txt")
#移除前两列的数据
user_name,user_sr=open_file.pop(0),open_file.pop(0)
print(open_file)
print(user_name,user_sr)
print(user_name+"’fastest times are:"+str(sorted(set([qxsj(i) for i in open_file]))[0:3]))

打印结果:

 完善代码思路:

  1. 一次性完成字典的创建
  2. 把字典创建代码一到get_file()函数中,返回一个字典而不是列表
  3. 把确定各个选手的3个最快时间的代码移到get_file()函数中
  4. 调整主代码中的函数调用,调用这个新版本的get_file()函数来支持新的操作模式

mikey.txt

mikey test,2000-2-2,2:22,3.01,3:01,3.02,3:02,3.02,3:22,2.49,2:38

 2.将sarah.txt中的名字与成绩打印出来(使用字典的方式)

#coding=utf-8
def get_file(filename):
    try:
        with open(filename) as f:
            data=f.readline().strip().split(",")
            #返回一个字典,字典中将各个数据提取出来
            return({
                "Name":data.pop(0),
                "DOB":data.pop(0),
                "Times":str(sorted(set([qxsj(i) for i in data]))[0:3])
            })
    except IOError as e:
        raise e
def qxsj(time_string):
    if "-" in time_string:
        splitter="-"
    elif ":" in time_string:
        splitter=":"
    else:
        return time_string
    (fen,miao)=time_string.strip().split(splitter)
    return(fen+"."+miao)
#sarch的记录
sarch_file=get_file("D:pydjsarah.txt")
print(sarch_file["Name"]+"’fastest times are:"+sarch_file["Times"])
#mikey的记录
mikey_file=get_file("D:pydjmikey.txt")
print(mikey_file["Name"]+"’fastest times are:"+mikey_file["Times"]) 

打印结果:

C:Python27python.exe D:/pydj/ex5.py
sara’fastest times are:['2.18', '2.25', '2.39']
mikey test’fastest times are:['2.22', '2.38', '2.49']

Process finished with exit code 0

 二:使用class定义类

 创建对象实例

a=Athlete()
b=Athlete()
c=Athlete()
d=Athlete()
  •  小括号告诉python要创建一个新的“Athlete”对象,然后复制给一个变量
  • 所有这些变量都是唯一的,类型都是Athlete

self的重要性

每个方法的第一个参数都是self

 

#定义一个a类
In [20]: class a:
    ...:     def __init__(self,a_name,a_dob=None,a_times=[]):
    ...:         self.name=a_name
    ...:         self.dob=a_dob
    ...:         self.times=a_times
    ...:    
#实例化该类     
In [21]: sarah=a("sarah","200-2-2",["2:55","2.3","9-6"])
#查看sarah的类型,为a类
In [22]: type(sarah)
Out[22]: __main__.a
In [23]: sarah
Out[23]: <__main__.a at 0x7f2df2262a20>
In [24]: sarah.name
Out[24]: 'sarah'
In [25]: sarah.dob
Out[25]: '200-2-2'
In [26]: sarah.times
Out[26]: ['2:55', '2.3', '9-6']

 3.将sarah.txt中的名字与成绩打印出来(使用类的方式)

#coding=utf-8
#编写代码来定义Athlete类
#除了__init__()方法外,还要定义一个新方法top3(),调用这个方法会返回最快的3个时间
#要调整dakaiwenjian()函数,返回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 str(sorted(set([fenge(i) for i in self.times]))[0:3])
def dakaiwenjian(filename):
    try:
        with open(filename,"r") as f:
            data=f.readline().strip().split(",")
            return(Athlete(a_name=data.pop(0),a_dob=data.pop(0),a_times=data))
    except IOError as e:
        raise e
def fenge(time_string):
    if "-" in time_string:
        splitter="-"
    elif ":" in time_string:
        splitter=":"
    else:
        return time_string
    (fen,miao)=time_string.strip().split(splitter)
    return(fen+"."+miao)
#sarch的记录
sarch_file=dakaiwenjian("D:pydjsarah.txt")
print(sarch_file.name+"’fastest times are:"+sarch_file.top3())
#mikey的记录
mikey_file=dakaiwenjian("D:pydjmikey.txt")
print(mikey_file.name+"’fastest times are:"+mikey_file.top3())

 打印结果:

C:Python27python.exe D:/pydj/ex8.py
sara’fastest times are:['2.18', '2.25', '2.39']
mikey test’fastest times are:['2.22', '2.38', '2.49']

Process finished with exit code 0

 4.向你的类增加两个方法,一个为add_time(),将一个额外的计时值追加到选手的计时数据。第二个方法add_times()会用一个或多个计时值(提供一个列表)来扩展一个选手的计时数据

#coding=utf-8
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 str(sorted(set([fenge(i) for i 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)
def dakaiwenjian(filename):
    try:
        with open(filename,"r") as f:
            data=f.readline().strip().split(",")
            return(Athlete(a_name=data.pop(0),a_dob=data.pop(0),a_times=data))
    except IOError as e:
        raise e
def fenge(time_string):
    if "-" in time_string:
        splitter="-"
    elif ":" in time_string:
        splitter=":"
    else:
        return time_string
    (fen,miao)=time_string.strip().split(splitter)
    return(fen+"."+miao)
#sarch的记录
sarch_file=dakaiwenjian("D:pydjsarah.txt")
#为sarch增加一个秒表时间
sarch_file.add_time("1.11")
print(sarch_file.name+"’fastest times are:"+sarch_file.top3())
#mikey的记录
mikey_file=dakaiwenjian("D:pydjmikey.txt")
print(mikey_file.name+"’fastest times are:"+mikey_file.top3())

 打印结果:

C:Python27python.exe D:/pydj/ex8.py
sara’fastest times are:['1.11', '2.18', '2.25']
mikey test’fastest times are:['2.22', '2.38', '2.49']

Process finished with exit code 0

 三:继承类

 5.继承python内置的list

In [28]: class Namelist(list):
    ...:     def __init__(self,a_name):
    ...:         list.__init__([])
    ...:         self.name=a_name
    ...:         
#实例化类
In [29]: huahua=Namelist("qwe")
In [30]: type(huahua)
Out[30]: __main__.Namelist
#该实例的方法
In [31]: dir(huahua)
Out[31]: 
['__add__',
 '__class__',
 '__contains__',
 '__delattr__',
 '__delitem__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__gt__',
 '__hash__',
 '__iadd__',
 '__imul__',
 '__init__',
 '__iter__',
 '__le__',
 '__len__',
 '__lt__',
 '__module__',
 '__mul__',
 '__ne__',
 '__new__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__reversed__',
 '__rmul__',
 '__setattr__',
 '__setitem__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 'append',
 'clear',
 'copy',
 'count',
 'extend',
 'index',
 'insert',
 'name',
 'pop',
 'remove',
 'reverse',
 'sort']
In [32]: huahua
Out[32]: []
#append方法
In [33]: huahua.append("one")
In [34]: huahua
Out[34]: ['one']
#extend方法
In [35]: huahua.extend(["two","three"])
In [36]: huahua
Out[36]: ['one', 'two', 'three']

 6.把原有的Athlete类的代码删除,写一个新的Atheletelist类,让它继承内置的list类,然后进行测试

#coding=utf-8
class  Athletelist(list):
    def __init__(self,a_name,a_dob=None,a_times=[]):
        list.__init__(self)
        self.name=a_name
        self.dob=a_dob
        #因为该类继承了list,所以不需要将a_times在重新赋值,直接将a_times,extend
        self.extend(a_times)
    #前三名成绩
    def top3(self):
        return str(sorted(set([fenge(i) for i in self]))[0:3])
def dakaiwenjian(filename):
    try:
        with open(filename,"r") as f:
            data=f.readline().strip().split(",")
            return(Athletelist(a_name=data.pop(0),a_dob=data.pop(0),a_times=data))
    except IOError as e:
        raise e
def fenge(time_string):
    if "-" in time_string:
        splitter="-"
    elif ":" in time_string:
        splitter=":"
    else:
        return time_string
    (fen,miao)=time_string.strip().split(splitter)
    return(fen+"."+miao)
#sarch的记录
sarch_file=dakaiwenjian("D:pydjsarah.txt")
#为sarch增加一个秒表时间
print(sarch_file.name+"’fastest times are:"+sarch_file.top3())
#mikey的记录
mikey_file=dakaiwenjian("D:pydjmikey.txt")
print(mikey_file.name+"’fastest times are:"+mikey_file.top3())

打印结果:

C:Python27python.exe D:/pydj/ex8.py
sara’fastest times are:['2.18', '2.25', '2.39']
mikey test’fastest times are:['2.22', '2.38', '2.49']

Process finished with exit code 0
原文地址:https://www.cnblogs.com/8013-cmf/p/7081270.html