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

掌握Python自定义字典类型:打造自己的映射容器 Python容器类型的常用操作对于一个Python使用者来说应该不陌生,其中字典是一种更复杂的容器结构。但有时候内容容器类型并不能满足我们的需求,我们有时候需要创造新的容器类型来满足需求,这篇文章我们一起看一下如何自定义字典类型?__init__: 初始化方法,用于创建字典实例并进行初始化操作。: 获取指定键对应的值。: 设置指定键对应的值。: 删除指定键及其对应的值。__len__: 返回字典中键值对的数量。__iter__: 返回一个迭代器,用于遍历字典中的所有键。keys() 阅读详情

本文将涉及到字典和类。字典可以有效地组织数据,可以将数据与名称关联(类似于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看作一个整体,那么dict与set类似
Head_First_Python笔记 Head_First_Python记录些啥引子初始python 人人都爱列表功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出... 阅读详情

相关推荐

Head First Python 读书笔记

第一章:基础知识 IDLE集成开发环境 是一个REPL环境(read-eval-print-loop)交互式编程工具,python内置的IDE,通过python解释器去运行代码,一般一次运行一条语句,对于了解python语句的语法非常的方便 如果想输入多条语句咋办?在打开的IDLE中,新建一个文件,然后在新建的文件中输入代码,保持,按 F5 运行,就可以在IDLE中看到结果 变量的声...

icessun 766

python实现一个简单的计时器

在python编程中,我们经常需要进行对代码的运行时间的基准测试,可以通过python编程写一个简单的计时器程序来实现这样一个过程。

Zach_Dave的博客 1215

10.7:Python中如何创建字典?

掌握如何创建和操作字典是Python编程中必不可少的一部分,能够帮助我们更加高效、简洁地编写代码。希望本文能够对读者了解和使用Python中的字典有所帮助。

小兔子平安 266

Python创建字典的八种方式

对于不同结构的数据选择最合适的创建字典方式

Sun_Raiser的博客 4万+

Head First Python(中文版)-源代码指南

本文还有配套的精品资源,点击获取 简介:《Head First Python》是一本Python编程入门经典书籍,其中文版源代码提供了丰富的实践案例。本指南包含了书中多个章节的源码,涵盖了从基础到进阶的Python编程概念和技术,适用于Windows和Mac OS操作系统。通过学习这些源代码,初学者可以深入理解Python的基础语法,并接触到实际编程中的常见问题和解决方法,...

weixin_42601608的博客 1099

Head First Python源码解析与实战应用

Python作为一门简洁且功能强大的编程语言,它的基础语法是理解这门语言的第一步。在本章节中,我们将详细介绍Python的基本语法结构,并且通过源码分析来深入理解这些语法是如何在Python内部得到实现的。Python的语法简洁明了,它摒弃了其他语言中复杂的类型声明和分号,而是使用缩进来定义代码块。变量不需要声明类型,可以直接赋值使用。同时,Python提供了丰富的数据类型,包括整数、浮点数、字符串、列表、元组、字典和集合等,每种类型都有其特定的用法和操作。

weixin_28746213的博客 758

想让字典操作更优雅?自定义Python字典类型,简化你的代码库!

在Python中,我们可以通过继承内置的dict类来创建具有特定行为的新字典类型。这允许我们在保留标准字典的所有特性的同时,添加额外的功能或覆盖默认的行为。

xyh2004的博客 2010

《Head First Python》第二版源代码:实战Python编程学习

通过实战项目,我们能够学习到如何将Python编程基础与实际应用相结合。在这个过程中,我们也可能会遇到一些问题和挑战,比如代码的优化、性能提升、安全性加固等。这些问题的解决将是我们编程实践中的宝贵经验。实战项目不仅能帮助我们巩固所学知识,还能激发我们对新技术的探索和学习欲望。通过不断的实践,我们能逐渐成长为更加全面的Python开发者。本文还有配套的精品资源,点击获取。

weixin_35706067的博客 773

python中head_Python(Head First)学习笔记:六

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:16julie2.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...

weixin_39908106的博客 168

Python自定义一个类实现字典dict功能的方法

今天小编就为大家分享一篇Python自定义一个类实现字典dict功能的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

半监督的医学分割数据集(LA, Pancreas, ACDC和PROMISE12)分享

这篇文章提供了四个常用的半监督医学分割数据集,所有数据集都已经被处理成了.h5文件。下载之后就可以直接使用

qq_45691955的博客 4171

Python Head First学习笔记

Python Head First这一本书也是我在大四实习的时候阅读的。现在主要在学习Android,所以已经有一段时间不碰Python了。现在把之前的笔记拿出来分享一下。笔记做的比较简陋,甚至连序号都没有。但都是可以看懂的内容。这本书也是从Python的基础知识讲起,内容还没有达到多么深入的地步。 len(array) print() print(array[1]) array.po...

诚朴求食 5643

开源onlyoffice编译完整过坑版

onlyoffice 编译过坑完整版;

sHImart 4551

Python-head-first 前6章

chapter1 官网下载Python3的安装包 安装python,下载相应的版本。安装成功,Windows控制行使用 python -V Python注重空格,一般情况使用Tab按键 处理复杂数据——电影数据列表 创建简单的Python列表 # 简短的电影列表 movies = ["taoteman","Japan"] # Python变量符没有类型 列表就像其他语言的数组,但不完全是,列表是完备的Python集合对象 使用中括号访问列表数据 Python列表增加更多数

laixiangwei的博客 239

【脑电绘图教程 2】使用Brainstorm进行脑电处理及源定位

Brainstorm 是一个开源应用程序,支持MEG、EEG、fNIRS、ECoG、深度电极和其他电生理学的数据分析,尤其用于MEG、EEG的源定位。Brainstorm的主要优点是其简单直观的图形界面,不需要进行任何编程,即可上手MEG、EEG分析,此外,它还支持多种数据类型(基本上EEGLab支持的,它都支持),并且具有数据批量处理功能,可以很方便的分析自己的数据。

qq_40735196的博客 1万+

Oracle入门——基础语法篇

ROWID是Oracle中的一个伪列,用于唯一标识数据库中的每一行。在查询中,可以使用ROWID来定位和操作特定的行,例如,删除特定的行或更新特定的行。在Oracle中,子查询是指嵌套在另一个查询内部的查询语句,它可以作为主查询的一部分,用于提供额外的过滤条件、计算或数据源。在Oracle中,连接查询是通过使用JOIN子句将两个或多个表中的数据合并在一起,以获取满足特定条件的结果集。在Oracle数据库中,ROWID和ROWNUM都是用于对行进行标识和定位的伪列,它们在查询中的使用有一些不同之处。

麦当当的博客 3088

Python初入门(六)(Head First Python 第六章 打包代码与数据 ,字典,类与继承)

打包代码与数据

ahaha413525642的博客 399

(五)深入理解Bluez协议栈之“GATT Server Profile”

上一篇介绍Bluez协议栈的了GAP Profile的实现,本章节我们继续介绍GATT Profile的实现,参考的程序是Peripheral。通过阅读它的实现代码可以发现,它广播部分是通过mgmt来实现的,然后在初始化完成之后,创建了一个L2CAP类型的socket,来负责实现GATT Server的逻辑。

1142

Head First Python chapter 4 学习笔记

chapter 4 1. 自定义模块安装到site-pakages 解释器在查看模块时,会从以下3个主要位置搜索模块: 当前工作目录 解释器的site-pakages的位置(包含了已安装的第三方Python模块,也包括自己写的) 标准库位置 使用setuptools安装模块到site-pakages 1. 创建一个发布描述 在要发布的文件的同一个文件夹下建立setup.py和README....

lans_sl的博客 219

YOLO26 无损剪枝:稀疏训练 + 结构化通道裁剪

YOLO26 无损剪枝链路:YOLO26s (7.2M) → 稀疏训练 30 epoch (L1 on BN gamma, lam=0.01) → 阈值剪枝 50% (gamma<quantile(0.5)) → 结构化重建 Conv+BN → 微调 10 epoch (lr=1e-4) → YOLO26n (1.9M, mAP50 0.808, 仅降 0.6%)。核心贡献:稀疏训练让 BN gamma 趋向二元分布 (近 0 或近 1), 剪枝阈值可直接取 median 自动 50% 压缩。

m0_64661770的博客 263

【AI理论学习】手把手推导扩散模型:Diffusion Models(DDPM)

生成扩散模型DDPM如下图所示分为前向、逆向两个过程,它首先通过不断往原始清晰数据中添加噪声使其变成标准高斯噪声(前向过程),而后期望从标准高斯噪声中还原原始数据(逆向过程)。若能实现,那便可从已知的标准高斯分布中采样一个噪声数据,而后利用DDPM模型生成符合原始数据分布的新数据。 Diffusion模型包含两个过程:数学符号:y∝xy\propto xy∝x:y正比于x,即y随着x增大而线性增大。 条件概率:贝叶斯公式:p(A∣B)=p(B∣A)×p(A)p(B)p(A|B)=\frac{p(B|A)\

小哲的博客 1507

[学习笔记]Head First Python 第6章 定制数据对象 打包代码和数据 6-1字典

# 第6章 定制数据对象 打包代码和数据 def readdata(file): try: with open(file) as datafile: data = datafile.readline() data = data.strip().split(',') # 从字符串首尾去除不想要的空白符'/n' # 方法串联 ...

qq_43605847的博客 165

JSON 与 JSON-RPC 的区别

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,基于文本,采用人类可读的语法来表示结构化数据。它起源于JavaScript,但如今已被几乎所有主流编程语言支持。标准文档:RFC 4627数据类型:支持 String、Number、Boolean、Null、Object、Array 六种基本类型格式示例"name": "张三","age": 30,JSON-RPC(JSON Remote Procedure Call)是一种远程过程调用(RPC)协议。

h a 6 6 6 c k 为 你解决复杂难题! 144

[学习笔记]Head First Python 第6章 定制数据对象 打包代码和数据 6-2定义面向对象的类 定制类

# 第6章 定制数据对象 打包代码和数据 ########################################## # 定义面向对象的类 定制类 # 代码:方法(method) 数据:属性(attribute) 数据对象:实例(instance) class Athlete: def __init__(self, a_name, a_dob=None, a_times=[])...

qq_43605847的博客 158

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

head first python豆瓣_Head First Python 学习心得(1-6章)

写在前面:“吾尝终日而思矣,不如须臾之所学也;吾尝跂而望矣,不如登高之博见也。登高而招,臂非加长也,而见者远;顺风而呼,声非加疾也,而闻者彰。假舆马者,非利足也,而致千里;假舟楫者,非能水也,而绝江河。君子生非异也,善假于物也。”十几年的默默学习,而今希望更多是对自己知识的一个总结反思积累,能够探讨进步更是求之不得。虽然现在coding能力有限,但所幸站在巨人肩膀上,可总有一天,我也能成为巨人。一...

weixin_39908070的博客 159

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

《head first python》——定制数据对象

一、实用字典关联数据 二、定义一个类 每个类都有一个__init__()方法来控制初始化对象,除了__init__(),每个方法第一个参数都是self >>> class Athelete: def __init__(self): self.thing = value def how_big(self): return(len(self.thing))需要注意:self是默认的,

小白兔的窝 936

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: 自定义 input type="file" 文件上传样式
下一篇: 基于maven的Spring+ActiveMQ整合Demo
hoxis
博客等级 码龄16年 789粉丝 239原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值