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. charles(version4.2.1)抓包手机数据

    点击菜单栏的Proxy项,选择Proxy Settings. 设置HTTP Proxy的Port. 勾选透明代理Enable transparent HTTP proxying,也可不勾选. 设置代理 ...

  2. Vue 中使用 typescript

    Vue 中使用 typescript 什么是typescript typescript 为 javaScript的超集,这意味着它支持所有都JavaScript都语法.它很像JavaScript都强类 ...

  3. 《深入理解Java虚拟机》-Java代码是如何运行的

    问题一:Java与C++区别 1.Java需要运行时环境,包括Java虚拟机以及Java核心类库等. 2.C++无需额外的运行时,通常编译后的代码可以让机器直接读取,即机器码 问题一:Java为什么要 ...

  4. 解决树莓派烧录系统后没有boot文件,只出现盘符问题

    首先,如果下图情况,说明你没有烧录好,继续向下看 放一张安装成功的图片 出现这个的原因是因为前期没有烧录好,它会回滚到img文件中,如果中途退出,它会写入到img文件中 正确文件大小(Raspbian ...

  5. Spring 2017 Assignments1

    一.作业要求 原版:http://cs231n.github.io/assignments2017/assignment1/ 翻译:http://www.mooc.ai/course/268/lear ...

  6. JDK基础必备面试十问

    1. new一个对象在Java内部做了哪些工作? 从静态角度来看,new一个对象表示创建一个类的对象实例. 从JVM运行角度来看,当JVM执行到new字节码时,首先会去查看类有没有被加载到内存以及初始 ...

  7. 腾讯PCG(后台开发) 牛客网视频面试 一面

    腾讯视频面试 作为一个小渣渣记录一下,腾讯是我一直想进的公司,但其实准备的时间不是很长,也不是科班还是存在很大的劣势,记录一下找工作的经历. 首先说一下,这是我第一次视频面试,还是蛮紧张的.不过面试官 ...

  8. ip地址、域名、DNS、URL的区别与联系

    IP:每个连接到Internet上的主机都会分配一个IP地址,此ip是该计算机在互联网上的逻辑地址的唯一标识,计算机之间的访问就是通过IP地址来进行的.写法:十进制的形式,用“.”分开,叫做“点分十进 ...

  9. springBoot框架分布式部署定时任务重复执行之解决方案

    问题描述: 在集群模式部署服务端时,会出现所有的定时任务在各自的节点处均会执行一遍,这显然不符合实际的开发场景,针对这种问题,本文给出一种springboot集成shedlock的解决方案 第一步:引 ...

  10. lrzsz——一款好用的文件互传工具

    日常开发中,经常需要在linux服务器和本地计算机(Windows或者Mac)两者之间传输文件,这时候就需要用到文件传输工具了. 最近偶然发现一款很好用的文件互传工具: lrzsz .墙裂推荐,好用指 ...