《Head First Python》学习笔记 Chapter6:自定义数据对象,字典与类

本文将涉及到字典。字典可以有效地组织数据,可以将数据与名称关联(类似于Map),从而实现快速查找。另外,也可以自定义类来处理一些功能,通过为对象增加一些属性和方法完成所需的功能。

所需文件获取地址:http://python.itcarlow.ie/chapter6/hfpy_ch6_data.zip

字典dictionary

字典是一个内置的数据结构,允许将数据与键进行关联,这样可以使内存中的数据与实际数据的结构保持一致。也可以称之为“映射”、“散列”、“关联数组”等。

创建字典dict

可以使用两种方式进行创建空字典,一种是使用大括号创建,一种是使用工厂函数dict()创建。

>>> cheese = {}
>>> palin = dict()

>>> type(cheese)
<class 'dict'>

>>> type(palin)
<class 'dict'>

添加数据

通过将值与键关联,向这两个字典中添加一些数据。注意两种添加方式的不同。

>>> cheese['Name'] = 'John Cheese'
>>> cheese['Occupations'] = ['actor', 'comedian', 'writer', 'file producer']

>>> palin = {'Name' : 'John Cheese', 'Occupations' : ['actor', 'comedian', 'writer', 'file producer']}

访问数据

通过字典名称加上[key]就可以访问到对应的值。

>>> palin['Name']
'John Cheese'
>>> cheese['Occupations']
['actor', 'comedian', 'writer', 'file producer']
>>> cheese['Occupations'][2]
'writer'

与列表不同的是,字典并不会维持插入的顺序,只是保持key-value之间的关联关系。

完成上篇文章中的需求,现在运动员的数据变成了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这种形式,其中不仅包含运动员数据,还有其他一些信息,需要进行特殊处理。

def sanitize(time_str):
    if '-' in time_str:
        spliter = '-'
    elif ':' in time_str:
        spliter = ':'
    else:
        return time_str
    (mins, secs) = time_str.split(spliter)
    return(mins + '.' + secs)

def get_coach_data(filename):
    try:
        with open(filename) as file:
            data = file.readline();
        dataList = data.strip().split(',')
        return {'Name' : dataList.pop(0), 'DOB' : dataList.pop(0), 'Times' : sorted(set([sanitize(str) for str in dataList]))[0:3]}
    except IOError as err:
        print('File error:' + str(err))
        return None

sarah = get_coach_data('sarah2.txt')

print(sarah['Name'] + "'s fastest times are: " + str(sarah['Times']))

方法、属性、实例

定义类

使用class关键字来定义类,同时可以使用__init__()方法来完成类的初始化构造(类似于Java中的构造方法)。

class Athlete:
    def __init__(self):
        # 完成对象'Athlete'的初始化工作
        ...

创建对象实例

在创建类的实例时,实际上调用了__init()__方法对类的实例进行了初始化。

a = Athlete()
b = Athlete()
c = Athlete()
d = Athlete()

self的重要性

self类似于Java中的this,用于指向当前对象实例。

定义一个类时,实际上实在定义一个定制工厂函数,任何可以在代码中使用这个工厂函数来创建实例:

Python在处理a = Athlete()这行代码时,会把工厂函数调用转化为以下调用,可以明确类(Athlete)、方法(__init__())和所处理对象实例(a):
Athlete().__init__(a)

如果没有self参数这个赋值,Python解释器将无法得出方法调用要应用到哪个实例,self参数可以帮助标识要处理哪个对象实例的数据。

每个方法的第一个参数都是self
下面对Athlete对象进行扩展,在一个名为thing的属性中存储一个值,同时增加一个how_big()方法返回thing的长度。

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

在一个对象实例调用类方法时,Python要求第一个参数是调用对象实例,这往往赋至各方法的self参数。

你写的代码 Python执行的代码
d = Athlete("Xiaoming") Athlete.__init__(d, "Xiaoming")
d.how_big() Athlete.how_big(d)

利用类存储数据改写之前的代码

def get_coach_data(filename):
    try:
        with open(filename) as file:
            data = file.readline();
        dataList = data.strip().split(',')
        # 此处返回一个Athlete对象
        return Athlete(dataList.pop(0), dataList.pop(0), dataList)
    except IOError as err:
        print('File error:' + str(err))
        return None

class Athlete:
    def __init__(self, name, dob=None, times=[]):
        self.name = name
        self.dob = dob
        self.times = times
    def getTop3(self):
        # sanitize方法没有变化,不再列出
        return sorted(set(sanitize(str) for str in self.times))[0:3]

sarah = get_coach_data('sarah2.txt')
print(sarah.name + "'s fastest times are: " + str(sarah.getTop3()))

添加新的方法

当需要额外新的功能时,可以向类中添加新的方法来实现所需的功能。

class Athlete:
    def __init__(self, name, dob=None, times=[]):
        self.name = name
        self.dob = dob
        self.times = times
    # 获取时间前3的数据列表
    def getTop3(self):
        return sorted(set(sanitize(str) for str in self.times))[0:3]
    # 添加一条新的时间数据
    def add_time(self, time):
        self.times.append(time)
    # 添加多条新的数据
    def add_times(self,times):
        self.times.extend(times)

类的继承

Python允许通过继承来创建一个类,包括用list、set、dict提供的内部数据结构类。
下面定义了一个NameList类,()中的list就表示它继承自list,因此它就具有了list的相关属性和方法。

class NameList(list):
    def __init__(self, name):
        list.__init__([])
        self.name = name
>>> nameList = NameList('a')
>>> type(nameList)
<class '__main__.NameList'>

>>> nameList.append(2)
>>> nameList.append('b')
>>> nameList
[2, 'b']

>>> nameList.name
'a'

利用继承重写Athlete类:

# 继承自list类
class AthleteList(list): 
    def __init__(self, name, dob=None, times=[]):
        list.__init__([])
        self.name = name
        self.dob = dob
        self.extend(times) # 不再吸引times属性,数据本身就是
    # 获取时间前3的数据列表
    def getTop3(self):
        return sorted(set(sanitize(str) for str in self))[0:3]

其他知识点

array.pop(i)

pop()属于array的方法,可以删除索引i处的数值,并返回该数值。默认参数为-1,因此默认会删除并返回数组中的最后一个元素。

>>> array = [1, 2, 3, 4]
>>> array.pop() # 弹出最后一个元素
4
>>> array.pop(2) # 弹出索引2处的元素
3
>>> array 
[1, 2]
>>> 

list set dict

名称 特点
list 列表,数据有序,可重复
set 集合,数据无序,不可重复
dict 键值对,若把key-value看作一个整体,那么dictset类似

如果觉得有用,欢迎关注我的微信,有问题可以直接交流:

你的关注是对我最大的鼓励!
你的关注是对我最大的鼓励!
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 什么是对象 Python中所有的数据都是以对象的形式存在,无论是简单的数字类型还是复杂的代码模块。在Python中...
    码农小杨阅读 807评论 0 3
  • 1.元类 1.1.1类也是对象 在大多数编程语言中,类就是一组用来描述如何生成一个对象的代码段。在Python中这...
    TENG书阅读 1,268评论 0 3
  • Python简介 Python历史 Python 是由 Guido van Rossum 在八十年代末和九十年代初...
    莫名其妙的一生阅读 1,050评论 0 2
  • pyton review 学习指南 https://www.zhihu.com/question/29138020...
    孙小二wuk阅读 1,050评论 0 2
  • 面对战友的离去 你忍住眼泪 依旧坚强 但 废墟上无助的眼眸 让你不能自己 痛彻心扉 该出手呀 就出手 严惩恶徒 否...
    刘芷源07阅读 162评论 0 2