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()方法,加入字典的创建和使用:

>>> def get_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])})
except IOError 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']

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

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

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

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

  关于Python的类

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

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

  使用class定义类

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

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

          初始化...

        类方法1....

        类方法2....

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

>>> 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) >>> 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]) >>> def get_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))
except IOError 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']

  总结:

    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 First)学习笔记:六的更多相关文章

  1. python3.4学习笔记(六) 常用快捷键使用技巧,持续更新

    python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...

  2. Requests:Python HTTP Module学习笔记(一)(转)

    Requests:Python HTTP Module学习笔记(一) 在学习用python写爬虫的时候用到了Requests这个Http网络库,这个库简单好用并且功能强大,完全可以代替python的标 ...

  3. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  4. python网络爬虫学习笔记

    python网络爬虫学习笔记 By 钟桓 9月 4 2014 更新日期:9月 4 2014 文章文件夹 1. 介绍: 2. 从简单语句中開始: 3. 传送数据给server 4. HTTP头-描写叙述 ...

  5. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  6. Python Built-in Function 学习笔记

    Python Built-in Function 学习笔记 1. 匿名函数 1.1 什么是匿名函数 python允许使用lambda来创建一个匿名函数,匿名是因为他不需要以标准的方式来声明,比如def ...

  7. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  8. Go语言学习笔记六: 循环语句

    Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...

  9. 【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  10. Linux学习笔记(六) 进程管理

    1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...

随机推荐

  1. 大厂面试Kafka,一定会问到的幂等性

    01 幂等性如此重要 Kafka作为分布式MQ,大量用于分布式系统中,如消息推送系统.业务平台系统(如结算平台),就拿结算来说,业务方作为上游把数据打到结算平台,如果一份数据被计算.处理了多次,产生的 ...

  2. Spring系列(四):Spring AOP详解

    一.AOP是什么 AOP(面向切面编程),可以说是一种编程思想,其中的Spring AOP和AspectJ都是现实了这种编程思想.相对OOP(面向过程编程)来说,提供了另外一种编程方式,对于OOP过程 ...

  3. scala之构造器详解

    1.基本语法: 构造器分为主构造器和辅助构造器 class 类名(形参列表) {  // 主构造器 // 类体 def  this(形参列表) {  // 辅助构造器 } def  this(形参列表 ...

  4. AUTOCAD二次开发-----删除一个图层里面的所有对象

    https://blog.csdn.net/aasswwe/article/details/40899759 private void Test() { // 获取当前文档和数据库 Document ...

  5. 数据仓库系列之ETL过程和ETL工具

    上周因为在处理很多数据源集成的事情一直没有更新系列文章,在这周后开始规律更新.在维度建模中我们已经了解数据仓库中的维度建模方法以及基本要素,在这篇文章中我们将学习了解数据仓库的ETL过程以及实用的ET ...

  6. php安装mongo扩展(linux)

    1.首先下载php的mongodb扩展 从http://pecl.php.net/package/mongodb这个网址下载mongodb的扩展源码包 2.解压安装包 tar zxf mongodb- ...

  7. 10.源码分析---SOFARPC内置链路追踪SOFATRACER是怎么做的?

    SOFARPC源码解析系列: 1. 源码分析---SOFARPC可扩展的机制SPI 2. 源码分析---SOFARPC客户端服务引用 3. 源码分析---SOFARPC客户端服务调用 4. 源码分析- ...

  8. 9407web常用符号

    常用符号 转载自 http://www.fhdq.net/ ❤❥웃유♋☮✌☏☢☠✔☑♚▲♪✈✞÷↑↓◆◇⊙■□△▽¿─│♥❣♂♀☿Ⓐ✍✉☣☤✘☒♛▼♫⌘☪≍←→◈◎☉★☆⊿※¡━┃♡ღツ☼☁❅♒✎©® ...

  9. layui下拉框不显示的问题

    1.先检查有没有引入layui.js 2.然后看有没有被<form class="layui-form"></form>包住, 3.查看是否有以下代码 &l ...

  10. MapDB使用入门

    背景 MapDB官网:http://www.mapdb.org 官方翻译之后的话:MapDB基于堆外存储.磁盘存储提供了Java的Maps.Sets.Lists.Queues等功能.它混合了Java集 ...