6 定制数据对象:数据结构自定义

打包代码与数据

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

现在要通过函数get_coach_data()来读取sarah2.txt,并完成排序的工作,代码如下:

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

输出:Sarah Sweeney's fastest times are:['2.18', '2.21', '2.22']

上面用到了pop(0),这个方法会删除并返回最前面的数据项;两个pop(0)调用则会删除前两个数据值,并把它们复制给指定的变量。

以上方法适用于数据较少的情况,如果数据量大了,就需要引入字典关联。

使用字典关联数据

字典是一个内置的数据结构(内置与Python中),允许将数据与键关联,这个键和数据库的键是相同的概念。

这样可以使内存中的数据与实际数据的结构保持一致,其他语言中可能称为:映射,散列,关联数组。

注:每个字典都有一个Name和一个Occupations列表列表。

有两种方法可以创建字典:

一:使用大括号创建;

如:cleese = {}

二:使用工厂函数创建;

如:palin =dict()

此外,可用type(cleese),type(palin)来查看字典的类型。

>>> cleese['Name']='John Cleese' #创建Name列表

>>> cleese['Occuptions']=['actor','comedian','writer','film producer'] #创建Occuptions列表

>>> palin={'Name':'Michael Palin','Occupations':['comedian','actor','writer','tv']} #创建字典内容,需注意palin字典是一次性同时创建的

>>> palin['Name']

'Michael Palin'

>>> cleese['Occuptions']

['actor', 'comedian', 'writer', 'film producer']

>>> cleese['Occuptions'][-1]

'film producer'

接下来,给palin和cleese增加出生地址信息:

>>> palin['Birthplace']="Broomhill,Sheffield,Endland"

>>> cleese['Birthplace']="Weston-super-Mare,North somerset,England"

>>> palin

{'Birthplace': 'Broomhill,Sheffield,Endland', 'Occupations': ['comedian', 'actor', 'writer', 'tv'], 'Name': 'Michael Palin'}

>>> cleese

{'Birthplace': 'Weston-super-Mare,North somerset,England', 'Occuptions': ['actor', 'comedian', 'writer', 'film producer'], 'Name': 'John Cleese'}

接下来,修改方法get_coach_data()方法,加入字典的创建和使用:

>>> defget_coach_data1(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])})exceptIOError as ioerr:print('File error:'+str(ioerr))return(None)>>> james=get_coach_data1('james2.txt')>>> print(james['Name']+"'s fastest times are:"+ james['Times'])

James Lee's fastest times are:['2.01','2.16','2.22']

>>> julie=get_coach_data1('julie2.txt')>>> print(julie['Name']+"'s fastest times are:"+ julie['Times'])

Julie Jones's fastest times are:['2.11','2.23','2.59']

>>> mikey=get_coach_data1('mikey2.txt')>>> print(mikey['Name']+"'s fastest times are:"+ mikey['Times'])

Mikey McManus's fastest times are:['2.22','2.31','2.38']

>>> print(sarah['Name']+"'s fastest times are:"+ sarah['Times'])>>> sarah=get_coach_data1('sarah2.txt')>>> print(sarah['Name']+"'s fastest times are:"+ sarah['Times'])

Sarah Sweeney's fastest times are:['2.18','2.21','2.22']

View Code

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

这样做的好处有:1使用类有助于降低复杂性;

2降低复杂性意味着bug更少;

3bug更少意味着代码更好维护;

关于Python的类

Python遵循标准的面向对象编程模型,一旦定义了类,就可以用类来创建数据对象,这个对象实例可以继承类的特性。

通常代码称为类的方法,数据通常称为类的属性,实例化的数据对象称为实例。

使用class定义类

基本格式:class 类名(继承类):

def __init__(self,参数1,参数2,....,列表1,列表2....):

初始化...

类方法1....

类方法2....

................

>>> defsanitize(time_string):if '-'intime_string:

splitter='-'

elif ':'intime_string:

splitter=':'

else:return(time_string)

(mins,secs)=time_string.split(splitter)return(mins+'.'+secs)>>> classAthleteList(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)deftop3(self):return(sorted(set({sanitize(t)for t in self}))[0:3])>>> defget_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))exceptIOError 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()))

James Lee's fastest times are: ['2.01','2.16','2.22']

>>> print(julie.name + "'s fastest times are:"+str(julie.top3()))

Julie Jones's fastest times are: ['2.11','2.23','2.59']

>>> print(mikey.name + "'s fastest times are:"+str(mikey.top3()))

Mikey McManus's fastest times are: ['2.22','2.31','2.38']

>>> print(sarah.name + "'s fastest times are:"+str(sarah.top3()))

Sarah Sweeney's fastest times are: ['2.18','2.21','2.22']

View Code

总结:

Python术语:

1 字典:Python的一种内置数据结构,允许将数据值与键关联;

键:字典中查找的部分,值:字典中的数据部分。

2 self:一个方法参数,总是指向当前对象实例。

方法:

1 通过dict()或{}可以创建一个空字典;

2 访问一个名为persion的字典与Name关联的值,可以用person['Name'];

3 字典和列表和集合有类似的地方,可以随新数据的增加而动态扩展;

4 可以用class关键字定义一个类;

5 类的方法和函数定义基本相同,用def关键字;

6 类的属性就像是对象实例中的变量;

7 可通过在类中定义__init__()方法来初始化对象实例;

8 类中定义的每个方法必须提供self作为第一个参数;

9 类中每一个数据前面都必须有self作为第一个参数,从而将数据与实例关联;

10 类可以从零开始构建,也可以从Python的内置类或从其他定制类继承;

11 类可以放到一个Python模块中,并上传到PyPI。

------------------------------------------------The End of Sixth Chapter-----------------------------------------------

python中head_Python(Head First)学习笔记:六相关推荐

  1. python中head_Python(Head First)学习笔记:二

    2 共享代码:连接共享社区.语法.函数.技巧 通过Python模块共享代码,在Python社区分享这些模块,让更多的人受益, 不得不说,Python真的做的不错~ Python提供了一组技术,用于模块 ...

  2. python中continue用法_Python学习笔记之Break和Continue用法分析

    本文实例讲述了Python学习笔记之Break和Continue用法.分享给大家供大家参考,具体如下: Python 中的Break 和 Continue break:控制何时循环应该结束 conti ...

  3. 《使用Python进行自然语言处理》学习笔记六

    第四章 编写结构化程序 4.1 回到基础 1 赋值 学过C,习惯了Java再过来学Python,感觉完全像<罗马假日>里安妮公主穿便装去城里撒欢一样.不需要声明,不需要初始化,随便用,太随 ...

  4. Python零基础入门(二)——Python中常见的数据结构[学习笔记]

    目录 1.Number(数字) 2.String(字符串) 3.List(列表) 4.Tuple(元组) 5.Set(集合) 6.Dictionary(字典) 1.Number(数字) Python ...

  5. python中pandas格式_Python学习笔记之数据分析中Pandas常用知识

    前言 Pandas基于两种数据类型:series与dataframe. 一个series是一个一维的数据类型,其中每一个元素都有一个标签.series类似于Numpy中元素带标签的数组.其中,标签可以 ...

  6. python中rim的用法_Python笔记(六)_函数

    函数一般是从第一行代码开始执行,结束于return语句.异常.或者函数所有语句执行完毕.一旦函数将控制权交还给调用者,就意味着全部结束.函数中做的所有工作以及保存在局部变量中的数据都将丢失.再次调用这 ...

  7. python中documentelement_python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)...

    xml.dom篇 DOM是Document Object Model的简称,XML 文档的高级树型表示.该模型并非只针对 Python,而是一种普通XML 模型.Python 的 DOM 包是基于 S ...

  8. python中deepcopy函数_Python学习笔记函数之copy()和deepcopy()

    随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...

  9. python中elif语句_Python学习笔记控制流语句之elif语句

    随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...

最新文章

  1. java强引用、软引用、弱引用、虚引用-Java的引用类型总共有四种,你都知道吗
  2. SAP UI5 应用开发教程之三十 - SAP UI5 的路由过程中进行参数传递试读版
  3. eclipemaven本地仓库依赖_只用一招,让你Maven依赖下载速度快如闪电
  4. 写代码抽取代码的技巧
  5. coords 动态定位_手机上定位坐标的实现
  6. CSRF漏洞原理/防御
  7. String类型转换的三种方法分析
  8. 解决手机浏览器顶部下拉出现网页源或刷新的问题
  9. web 折线图大数据量拉取展示方案_对比多种微前端方案
  10. HoloLens 2开发:HoloLens开发VS安装与配置
  11. 003、使用MegaCli工具查看Raid磁盘阵列状态
  12. 魅族16xs可升级Android10吗,手机评测 篇十一:用了魅族16Xs半个月,谈谈我的使用感受...
  13. C语言——输入两个正整数m和n,求其最大公约数和最小公倍数。
  14. 苹果iOS第三方应用商店,App store没有的这都有!发烧友赶紧来!
  15. ctfshow-萌赛
  16. 让你的桌面腾飞吧(OpenSolaris2008.05 + VirtualBox + WinXP)
  17. 解决android studio编译的速度慢,安装apk过慢的问题
  18. 期货贴水如何交割(期货交割升贴水)
  19. B类网络计算子网IP范围和掩码
  20. 索爱有android手机吗,全球最小Android手机 索爱X10 Mini首测

热门文章

  1. 威斯康星大学计算机案例,美国威斯康星大学麦迪逊分校CS硕士录取
  2. 如何更换ppt模板内容不变_如何制作一个优秀的PPT?附18000+套精品PPT模板
  3. 直播预告:WLS/WAS故障基本分析介绍
  4. 解读年度数据库性能:PostgreSQL的日志文件和数据加载
  5. Oracle 19c 新特性:ADG的自动DML重定向增强读写分离
  6. 集成学习中的随机森林
  7. 【华为云技术分享】Mind Studio Docker镜像部署分享
  8. 补习系列(14)-springboot redis 整合-数据读写
  9. 计算机学校招生分数线,重庆工商计算机学校2020年招生录取分数线
  10. Android笔记 theme主题