第四部分 python对象类型(列表、字典)

列表

列表是一个任意类型的对象的位置相关的有序集合,没有固定的大小。与字符串不同的是列表是可变的通过对相应偏移量进行赋值可以定位地对列表进行修改
序列操作
列表支持之前讨论到对字符创的所有的序列操作。唯一的区别是结果是列表而不是字符串。
特定类型的操作
python的列表没有固定类型的约束,列表中可以包含不同类型 的对象;列表也没有固定大小,可以根据需要来随意增加或减少列表大小:
在这里插入图片描述
在这里插入图片描述
append方法增加列表的大小,并在列表尾部插入一项。pop方法(或者del语句)移除给定偏移量的一项等,因为列表是可变的,大多数的列表方法都会原位置改变列表对象,而不是创建一个新的列表。
边界检查
尽管python中列表没有固定的大小,但是python不允许引用不存在的元素。超出列表末尾之外的索引总是会导致错误,对末尾范围之外赋值也是如此。
在这里插入图片描述
为了让一个列表增大,我们可以调用append这样的列表方法。
嵌套
pytho核心数据类型的一个优秀特性就是它们支持任意的嵌套。能以任意的组合对其进行嵌套,并可以多个层次进行嵌套。这种特性的一个直接应用就是实现矩阵。
在这里插入图片描述
推导
除了序列操作和列表方法外,python还支持一种更高级的列表推导表达式操作,可以用来处理矩阵,因为python中的矩阵是按照行来进行储存的,因此可以很简单的利用索引就可以获得矩阵的行,而要获得矩阵的列往往就需要通过列表推导表达式。(NumPy)
在这里插入图片描述
列表推导源自数学中集合的概念。它是通过一种对序列中的每一项运行一个表达式来创建一个新列表的方法,每次一个,从左到右。列表推导是编写在方括号中的,并使用了同一个变量名表达式和循环结构组成,它在实际中的运用可以变得更复杂。
在这里插入图片描述
这些表达式同样可以用于储存对个数值,只要将这些值包在一个嵌套的集合中。下面的代码展示了原生函数range生成连连续整数的功能。
在这里插入图片描述
列表推导能在python中的任何序列类型中发挥作用,甚至一些不属于序列的类型。会在后续学习中详细了解。

字典

字典不是序列,而是一种映射。它同样是一个其他对象的集合,但它是通过键(key)而不是通过相对位置来储存对象的。字典也是python中唯一的一种映射类型,具有可变性。同列表一样,可以就地改变并随着需求增大或者减小。
映射操作
字典作为常量编写时,编写在大括号中,并包含一系列的“键:值”对,我们可以通过键对这个字典进行索引来读取或者改变键所关联的值。字典的索引操作使用的适合序列相同的语法,但是在方括号中的元素是键,而不是相对位置。

在这里插入图片描述
字典还有其他几种创建方法:
在这里插入图片描述
先创建一个空的字典,然后再向里面填充。与列表中禁止边界外的赋值不同,对一个新的字典的键赋值会创建该键。
还有dict类型名传递键值参数对,或者zip配对来创建。
在这里插入图片描述
再次强调字典的键从左到右的顺序是被打乱的!映射并不是按位置排列的,就算返回值和输入的值顺序一样也仅仅是概率问题。

重返嵌套
在这里插入图片描述
嵌套允许直接并轻松地建立复杂的信息结构。此外方便的是,python中当最后一次引用对象后(例如这个变量用其他的值进行赋值),这个对象所占用的内存空间将会自动清理掉。python的垃圾回收特性可以在运行时可以清理不再会用的内容。这部分内容会在后续内容介绍。

不存在的键:if测试
如同映射,字典只支持通过键访问对象,但除此之外,它们也支持通过方法调用进行指定类型的操作。虽然能够通过给新的键赋值来扩充字典,但访问一个不存在的键仍然是一个错误。
在这里插入图片描述
在我们访问一个不存在的东西往往会是一个程序错误,但我们并不希望得到一个错误。此时,一个技巧就是在这之前进行测试。字典的in关系表达式允许我们查询其中一个键是否存在,并可以通过python的if语句对查询的结果进行分支处理。
在这里插入图片描述
此处代码有错误,暂时没明白是什么原因(没有缩进)
在这里插入图片描述
在这里插入图片描述除了in测试,还有其他方法进行测试,如get方法(带有一个默认值的条件索引)、try语句(一个捕捉异常并从异常中恢复的工具)、if/else三元表达式(实质上是挤在一行的一条if语句)。
在这里插入图片描述

键的排序:for循环
因为字典不是序列,所以我们不能要求打印我们建立的字典中键的顺序会和输入时一样,但当我们确实需要字典按字典出现的时候,一个常用的方法就是通过字典的key方法收集一个键的列表,使用列表sort方法进行排序,然后用for循环逐个进行显示结果。
在这里插入图片描述
(python3.7这默认就是有序的,不知道是巧合还是改进过了。。)
这个三步骤的过程可以由sorted内置函数一步完成:
在这里插入图片描述
for循环以及与其作用相近的while循环,是在脚本中编写重复性任务语句的主要方法。for循环是一个序列操作(其实是迭代操作),可以作用于任何一个序列对象上,并且就像列表推导一样,甚至可以作用于一些不是序列的对象。while循环虽然更为常见,且不局限于逐一访问序列,但通常需要更多的代码:
在这里插入图片描述

## 迭代和优化
for循环和列表表达式都是真正的通用迭代工具,事实上,它们都能够工作于遵守迭代协议的任意可迭代对象。
一个可迭代的对象可以实内存中物理储存的序列,也可以是一个在迭代操作情况下每次产生的一个对象(一种“虚拟”的序列)。它们都被认为是可迭代的对象。之前的推导表达式生成器(generator)就是后者,python文件对象则是前者(文件内容不是在一个列表中,而是按需取出)。
任何一个从左到右扫描一个对象的python工具都使用迭代协议。因为字典是可迭代的对象,因此之前的sorted调用可以直接作用于字典对象而不是使用sort方法来得到一个序列。
也意味着任何的列表推导表达式都可以编写成一个等价的for循环,通过在运行时手动添加列表来创建最终的列表。
在这里插入图片描述
两种工具在迭代协议内部发挥作用,并产生相同的作用,但运行的速度在不同情况下有差异,后面再进行详细学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值