新的文件格式

<span style="font-size:18px;">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
</span>

如果使用split()BIF把数据抽取到一个列表,第一个数据项是名字,然后是出生日期,然后是计时数据。

<span style="font-size:18px;">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]))</span>

"pop(0)"调用将删除并返回列表的最前面的数据项。两个调用会删除前面两个数据值,并把它们赋给指定的变量。

在上面的代码中,表示sarah的3部分相关数据分别存储在3个不同的变量中。如果选手增加,需要的变量成倍增加。

使用字典关联数据

字典是一个内置的数据结构,允许将数据(也成为“值”)与键而不是数字关联。

Name ----> "Sarah Sweeney"
DOB  ---->"2002-6-17"
Times---->[2:58,2.58,2:39,2-25,2-55,2:54,2.18,2:55,2:55,2:22,2-21,2.22]

创建空字典,一种使用大括号,一种使用工厂函数创建:

>>>cleese={}
>>>palin=dict()  #可以一次性同时创建字典

修改代码如下:

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

代码还可以改进的建议:

  1. 一次性完成字典的创建
  2. 把字典创建代码移到get_coach_data()函数中,返回一个字典而不是列表
  3. 把确定各个选手的3个最快时间的代码移到get_coach_data()函数中。
  4. 调整主代码中的函数调用,调用这个新版本的get_coach_data()函数来支持新的操作模式
def get_coach_data(filename):try:with open(filename) as f:data=f.readline()templ=data.strip().split(',')return({'Name':templ.pop(0),'DOB':templ.pop(0), #一次性创建字典'Times':str(sorted(set([sanitize(t) for t in templ]))[0:3])})  #确定前3个最快时间except IOError as ioerr:print('File error: '+str(ioerr))return(None)
james=get_coach_data('james2.txt')  #一个选手调用函数,并根据需要调用"print()"语句。print(james['Name']+" 's fastest times are: "+james['Times'])

将代码及其数据打包在类中

这么做的好处是:

  1. 使用类有助于降低复杂性
  2. 降低复杂性意味着bug更少
  3. bug更少意味着代码更可维护

定义一个类

在面向对象的世界里,你的代码通常称为类的方法(method),数据通常称为类的属性(attribute),实例化的数据对象称为实例(instance)。

class Athlete: #类定义从class关键字开始,选取一个合适的描述性的名字def __init__(self):  #前后都有两个下划线,最后是冒号#The code to initialize a "Athlete" object.  初始化各个对象的代码

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

Python要求每个方法的第一个参数为调用对象实例。

class Athlete:def __init__(self,value=0):self.thing=valuedef how_big(self):return(len(self.thing))

使用IDLE定义新类,创建一些对象实例

>>>class Athlete:def __init__(self,a_name.a_dob=<span style="color:#ff0000;">None</span>,a_times=<span style="color:#ff0000;">[]</span>):  <span style="color:#ff0000;">#注意后两个参数的缺省值</span>self.name=a_nameself.dob=a_dobself.times=a_times
>>>sarah=Athlete('Sarah Sweeney','2002-6-17',['2:58','2.58','1.56])
>>>james=Athlete('James Jones')     

修改后的代码

class Athlete:def __init__(self,a_name,a_dob=None,a_times=[]):self.name=a_nameself.dob=a_dobself.times=a_timesdef 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')print(james.name+" 's fastest times are: "+str(james.top3()))

向类中增加两个方法,add_time(),将一个额外的计时值追加到选手的计时数据,add_times()用一个或多个计时值扩展选手的计时数据。

    def add_time(self,time_value):     #伪装的append()方法和extend()方法self.times.append(time_value)def add_times(self,time_list):self.times.extend(time_list)

继承Python内置的list

class允许通过继承现有的其他类来创建一个类,包括用list、set和dict提供的Python内置数据结构类。

在IDLE中首先派生内置list类创建一个定制列表,其有一个名为name的属性:

<pre name="code" class="python">>>> class Namelist(list):def __init__(self,a_name):list.__init__([])   #初始化派生类,然后把参数赋至属性self.name=a_name>>> johnny=Namelist("John Paul Jones")
>>> type(johnny)   #<span style="color:#cc0000;">"johnny"是一个"Namelist"</span>
<class '__main__.Namelist'>
>>> dir(johnny)  #<span style="color:#cc0000;">"johnny"可以做的事情</span>
['__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__', '<span style="color:#cc0000;">append</span>', 'clear', 'copy', '<span style="color:#cc0000;">count</span>', '<span style="color:#cc0000;">extend</span>', 'index', 'insert', '<span style="color:#cc0000;">name</span>', 'pop', 'remove', 'reverse', 'sort']
>>> johnny.append("Bass Player")
>>> johnny.extend(['Composer','Arranger','Musician'])
>>> johnny
['Bass Player', 'Composer', 'Arranger', 'Musician']
>>> johnny.name
'John Paul Jones'
>>> for attr in johnny:  <span style="color:#cc0000;">#按列表处理"johnny"</span>print(johnny.name+" is a "+attr+".")John Paul Jones is a Bass Player.
John Paul Jones is a Composer.
John Paul Jones is a Arranger.
John Paul Jones is a Musician.

含有AthleteList类的新代码

class AthleteList(list):def __init__(self,a_name,a_dob=None,a_times=[]):list.__init__([])self.name=a_nameself.dob=a_dobself.extend(a_times)def top3(self):return(sorted(set([sanitize(t) for t in <span style="color:#cc0000;">self</span>]))[0:3])
演练新类
vera=AthleteList('Vear Vi')  #<span style="color:#cc0000;">使用新的类名</span>
vera.append('1.31')
print(vera.top3())
vera.extend(['1.45','2.45','2,31'])
print(vera.top3())

Head First Python(定制数据对象)相关推荐

  1. 《Head First Python》第六章--定制数据对象

    先上数据集:Head First Python 数据集 第六章的数据在第五章的基础上加了两个属性:姓名和出生日期 james2.txt James Lee,2002-3-14,2-34,3:21,2. ...

  2. python集合数据对象_python学习第七天 基础数据类型补充 深浅copy 集合 关键字后面加可迭代对象...

    在基础数据类型中可能遇到的坑: 元组: tuple1=(1) 的数据类型是int , tuple2=('alex')的数据类型是str 等 tuple1=(1,) 和 tuple2的数据类型是 tup ...

  3. Python使用matplotlib可视化斜率图、对比同一数据对象前后(before、after)两个状态的差异(Slope Chart)

    Python使用matplotlib可视化斜率图.对比同一数据对象前后(before.after)两个状态的差异(Slope Chart) 目录

  4. python substr_python数据分析-数据对象(一)

    Python基本数据类型一般分为:数字.字符串.列表.元组.字典.集合这六种基本数据类型. 不可变(3 个):Number(数字).String(字符串).Tuple(元组): 可变(3 个):Lis ...

  5. python pickle模块的使用/将python数据对象序列化保存到文件中

    # Python 使用pickle/cPickle模块进行数据的序列化"""Python序列化的概念很简单.内存里面有一个数据结构, 你希望将它保存下来,重用,或者发送给 ...

  6. python数据符号函数等一切皆对象_第一章:Python高级编程-Python一切皆对象

    第一章:Python高级编程-Python一切皆对象 Python3高级核心技术97讲 笔记 1. Python一切皆对象 1.1 函数和类也是对象,属于Python的一等公民 "" ...

  7. python代码示例图形-纯干货:手把手教你用Python做数据可视化(附代码)

    原标题:纯干货:手把手教你用Python做数据可视化(附代码) 导读:制作提供信息的可视化(有时称为绘图)是数据分析中的最重要任务之一.可视化可能是探索过程的一部分,例如,帮助识别异常值或所需的数据转 ...

  8. Python变量和对象类型速记手册

    变量和对象类型 Python中关于变量和对象类型有一些重要的概念: 变量不受类型约束 变量并不是一块内存空间的标签,只是对象的名字,是没有类型的,相当于一个可以指向任何对象void指针.类型属于对象, ...

  9. 【云驻共创】华为云AI之用Python定制我的《本草纲目女孩》

    文章目录 前言 一.华为云ModelArts-Notebook介绍 1.华为云ModelArts-Notebook 1.1 Jupyter Notebook是什么 1.2 JupyterLab是什么 ...

最新文章

  1. MIT设计深度学习框架登Nature封面,预测非编码区DNA突变
  2. TensorFlow:实战Google深度学习框架(五)图像识别与卷积神经网络
  3. 0408~送给小伙伴的汉堡包
  4. 图片裁剪和异步上传插件--一步到位(记录)
  5. html 中 标签里面的id 和 name 有什么区别?
  6. linux下ip协议(V4)的实现(一)
  7. Rsync总结笔记—以守护进程(socket)方式传输数据
  8. 春节期间小明使用微信收到很多个红包,非常开心。在查看领取红包记录时发现,某个红包金额出现的次数超过了红包总数的一半。请帮小明找到该红包金额。写出具体算法思路和代码实现,要求算法尽可能高效。...
  9. CentOS 7上快速安装saltstack
  10. SQL Server完整性备份说明
  11. Leetcode面试题22. 链表中倒数第k个节点
  12. 微信小程序3-模板与配置
  13. 通往财富自由之路详细笔记(11)
  14. 类似捕鱼达人的金币效果
  15. 关于固态硬盘闪存芯片研究资料收集
  16. 淘宝群发软件哪款比较好?
  17. 【黄啊码】什么是php-fpm?
  18. 华为信息中心配置命令,很全
  19. EKS自动扩容-方式一:ASG负载检测自动扩容功能
  20. android仿微信充值布局,Android 高仿微信支付数字键盘功能

热门文章

  1. Codasip通过收购Cerberus增强RISC-V处理器设计的安全性
  2. 转行程序员日记---2020-10-16【最近有点累】
  3. [英语六级] 六级通关笔记 — 翻译题
  4. 实时人体姿态估计!Efficient-HRNet:更快!更强!!
  5. 数据结构---王道408
  6. 华为手机充满有提醒吗_手机充满电铃声提醒软件下载-华为手机充满电铃声提醒软件app下载 v1.0-友情手机站...
  7. 摩托罗拉Z2硬改相机无人直播刷机教程
  8. 数据库基础语法--php基础最详细教程
  9. 技术不是越来越简单,而是框架是你的羁绊
  10. HTML5案例之蚊香、棒棒糖、爱心、五角星