【七】定制数据对象

一:编写程序

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

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:\pydj\sarah.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:\pydj\sarah.txt")
print(sarch_file["Name"]+"’fastest times are:"+sarch_file["Times"])
#mikey的记录
mikey_file=get_file("D:\pydj\mikey.txt")
print(mikey_file["Name"]+"’fastest times are:"+mikey_file["Times"]) 

打印结果:

C:\Python27\python.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:\pydj\sarah.txt")
print(sarch_file.name+"’fastest times are:"+sarch_file.top3())
#mikey的记录
mikey_file=dakaiwenjian("D:\pydj\mikey.txt")
print(mikey_file.name+"’fastest times are:"+mikey_file.top3())

打印结果:

C:\Python27\python.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:\pydj\sarah.txt")
#为sarch增加一个秒表时间
sarch_file.add_time("1.11")
print(sarch_file.name+"’fastest times are:"+sarch_file.top3())
#mikey的记录
mikey_file=dakaiwenjian("D:\pydj\mikey.txt")
print(mikey_file.name+"’fastest times are:"+mikey_file.top3())

打印结果:

C:\Python27\python.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:\pydj\sarah.txt")
#为sarch增加一个秒表时间
print(sarch_file.name+"’fastest times are:"+sarch_file.top3())
#mikey的记录
mikey_file=dakaiwenjian("D:\pydj\mikey.txt")
print(mikey_file.name+"’fastest times are:"+mikey_file.top3())

打印结果:

C:\Python27\python.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
时间: 2025-01-02 16:57:43

【七】定制数据对象的相关文章

Python学习笔记_Chapter 6定制数据对象

1. 有用的BIF a. 判断字符串中是否包含子字符串 1 if s_a in s_b: b. pop() 描述:从指定的列表位置删除并返回一个数据项. 1 (sarah_name,sarah_dob)=l_rah.pop(0),l_rah.pop(0) 2 #pop(0)中0位置为list中第一个数据项 3 #第一次执行pop赋值给sarah_name c. strip() 输入的是字符串,返回的是列表 d.open 读文件时可以多种方式打开文件,取出的数据是不同的,可以是文本也可以是二进制.

[Head First Python]6. 定制数据对象:打包代码与数据

相同功能,演进实现 数据文件 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 1- 返回dict return({'Name':data_list.pop(0), 'DOB':data_list.pop(0), 'Time':str( sorted( set([sanitize(t) for t in data_list] ) )[0:3])}) 1 def sanitize(time

【Python】[07]定制数据对象

这章主要学习数据字典和类. 字典 python中字典的定义为:一个内置的数据结构(内置于python中),允许将数据与键而不是数字关联.这样可以使内存中的数据与实际数据的结构保持一致. 创建空字典的方式: 1.使用大括号来创建一个空字典,如:cleese={} 2.使用dic()工厂函数来创建空字典,如:cleese=dic() 通过将值与键关联,可以向空字典中增加数据,这两种方法向字典添加数据的区别是: 第一种创建方式可以分步向空字典中添加数据 cleese["Name"]=&quo

六、定制数据对象(Python的面向对象) ----- 打包代码与数据

创建Python字典 python字典即为键值对,相当于Java中的map,其创建的两种形式: a = {} # 普通方式 b = dict() # 使用工厂函数 字典的赋值与访问 #创建字典 >>> cleese['Name'] = 'John Cleese' >>> cleese['Occupations'] = ['actor','comedian','writer','film producer'] >>> palin = {'Name':'M

Head Frist Python 读书笔记 第六章 定制数据对象

Bullet Points: 定义Class python中的class和JavaScript中的类似(后悔没有认真看JS),原则只有一个“方法是共享的,而属性不共享” class AthleteList: 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([float(sanit

java:Hibernate框架(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态)

1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件  准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configurati

如何用 Hadoop/Spark 构建七牛数据平台

数据平台在大部分公司都属于支撑性平台,做的不好立刻会被吐槽,这点和运维部门很像.所以在技术选型上优先考虑现成的工具,快速出成果,没必要去担心有技术负担.早期,我们走过弯路,认为没多少工作量,收集存储和计算都自己研发,发现是吃力不讨好.去年上半年开始,我们全面拥抱开源工具,搭建自己的数据平台. 1.数据平台设计理念 公司的主要数据来源是散落在各个业务服务器上的半结构化日志,比如系统日志.程序日志.访问日志.审计日志等.日志是最原始的数据记录,如果不是日志,肯定会有信息上的丢失.说个简单的例子,需求

使用LinQ实现对数据对象的查询

因为项目需要,接触到了LinQ,经过一段时间的学习,对LinQ有了简单的认识,本文就这个话题做个简单的叙述. 首先,应该写出几个问题,从宏观上了解一下.LinQ是什么?为什么使用LinQ?使用它有什么好处? 语言集成查询(Language Intergrated Query),是一组用于C#和vb语言的扩展,它允许编写C#或者vb代码以查询数据库相同的方式操作内存数据.----百度百科 通俗点说,它就是查询数据的.那么为什么要用它来查询数据呢,使用它有什么有点吗? 我们从稍微抽象一点的角度来考虑

【微信分享】王团结:如何用Hadoop/Spark构建七牛数据平台

摘要:7月30日,七牛数据平台工程师王团结就七牛内部使用的数据平台,深入分享了该团队在Flume.Kafka.Spark以及Streaming上的实践经验,并讲解了各个工具使用的注意点. 继" YARN or Mesos?Spark痛点探讨"." Mesos资源调度与管理的深入分享与交流".及" 主流SQL on Hadoop框架选择"之后,CSDN Spark微信用户群邀请了王团结为大家分享Hadoop/Spark在七牛数据平台的实战. 王团结