起步
前面有讲到复合类型的概念以及一些要素和掌握方法,还有元组的使用。但实际上来说,python实际开发过程中,真正用的多的是列表和字典,所以掌握了它俩,即使你说你不会元组不会集合都没有关系,当然这是不可能的,因为它们(元组、列表、字典、集合)彼此是相通的,基本上都可以举一反三。
在讲述列表、字典、集合之前,先了解下进阶概念。
复合类型中的进阶概念
可变对象与不可变对象
造成这个现象的原因是对象对内存的引用不是一成不变的。我们观察一个变量。肉眼可以看到的是它含有什么值,但对计算机来说,能看到的只是这个变量引用了哪个地址块。我们先通过一个小实验来简单了解一下。
# 我们可以通过id()来观察变量引用的还是不是同一个对象。a = 80print(id(a))a += 2print(id(a))b = 80print(id(b))
输出结果如下:
140712320003184140712320003248140712320003184
通过输出结果我们可以发现,对于a变量,它引用的对象不是一成不变的,从a=80到a=82,a所引用的对象已经发生了改变。对于b来说,我给它赋值了80,你会发现它引用的对象居然和a=80的时候引用的是同一个!
这是因为,一些比较常用的不可变对象,python不会立马回收它,而是会在内存中存放一段时间,这样当有其它变量再次引用这个对象的时候,就不用重新创建了,提高了效率。
所以总结出来,
可变对象是,变量所引用的对象不变的情况下,变量的值可以发生改变。
不可变对象是,变量所引用的对象不变的情况下,变量的值不可以改变。如果改变了变量的值,其实相当于改变了变量所引用的对象。
所以,都明白了不?
python中的可变对象和不可变对象。除了list,dict,set(即列表,字典,集合)之外,都是不可变对象。
好了,接着上菜,接下来上主菜。
主菜来了--列表即list
列表是用的最多的一个数据类型,实际编程中,基本都不会少它的份,所以掌握好列表至关重要。
列表通常是由一个[ ]包裹起来的,它有以下特征:
- 列表的元素不必都是同一种数据类型,可以都是整型,也可以部分元素是整型,部分元素是浮点型,部分元素是字符串...
- 列表的元素可以是其它复合类型,比如列表里面可以包含元组,可以包含列表集合等
- 列表的元素可以动态增加修改删除,不是固定的
列表有非常多的函数,但我们没必要都背下来,只需要实际看看,脑子里有印象列表可以做什么操作就行了。下图是列表常用到的一些函数,再次声明,不要去记这些函数,而是理解函数是干什么的。假设我们有一个列表变量叫做L。
- L.append(x) 即在L的末尾添加x元素
- L.count(x) 即在L中查找x出现的次数
- L.extend(L1) 其中L1是一个列表,这个函数的意思是,将L1的元素全部添加到L中。
- L.index(x) 查找x在L中的位置,如果有多个元素,返回第一个x所处的位置。
- L.remove(x) 移除L中的x元素,如果x出现了多次,则移除第一个x。
- L.reverse() 对L进行转置,即将列表中的元素倒过来。
- L.insert(i,x) 将x插入到L中的第i位置中。
列表的初始化
# 列表的初始化# 空列表list_1 = []# 直接用[]包裹你要初始化的元素list_2 = [1, 2, 3, 'a', 45.55]# 将其它复合类型转换成列表list_3 = list((4, 5, 6))
列表的常用操作示例
# 列表的常用操作print("未执行操作前,list_2是这样的")print(list_2)# 在末尾添加元素print("在末尾添加元素")list_2.append("末尾")print(list_2)# 在指定位置添加元素print("在指定位置添加元素")list_2.insert(2, "指定位置")print(list_2)# 计算1在list_2中出现的次数print("计算1在list_2中出现的次数")print("1出现了{0}次".format(list_2.count(1)))# 查找1在list_2中第一次出现的位置print("查找1在list_2中第一次出现的位置")index = list_2.index(1)print("1在list_2中的下标是:{0}".format(index))
输出结果:
未执行操作前,list_2是这样的[1, 2, 3, 'a', 45.55]在末尾添加元素[1, 2, 3, 'a', 45.55, '末尾']在指定位置添加元素[1, 2, '指定位置', 3, 'a', 45.55, '末尾']计算1在list_2中出现的次数1出现了1次查找1在list_2中第一次出现的位置1在list_2中的下标是:0移除list_2中的1元素[2, '指定位置', 3, 'a', 45.55, '末尾']list_3的元素全部添加到list_2中[2, '指定位置', 3, 'a', 45.55, '末尾', 4, 5, 6]
除此之外,我们可能还需要对列表的子集进行操作。要对列表的自己进行操作,首先要懂切片,不懂的朋友麻烦翻翻我讲基本数据类型的那个文章。
这里提醒一些,切片的正确形式是[起始位置:终止位置:步长],当起始位置是列表的开头时,起始位置可以省略,当终止位置是列表的末尾时,终止位置也可以省略,当步长是1时,步长也可以省略。举几个例子。
- [:]表示取列表的所有数据
- [:3]表示取前3项
- [::3]表示每隔3位取一个元素,即取出来的元素是原列表中的第一位,第四位,第七位,第十位...
子集操作
# 对列表的子集进行操作# 取list_2的前三个元素print(list_2[0:3])# 如果是从0开始,0可以省略print(list_2[:3])# 取list_2的后三个元素print(list_2[-3:])# 取list_2的全部元素print(list_2[:])# 取list_2的偶数项print(list_2[::2])
输出结果:
[2, '指定位置', 3][2, '指定位置', 3][4, 5, 6][2, '指定位置', 3, 'a', 45.55, '末尾', 4, 5, 6][2, 3, 45.55, 4, 6]
至此,集合的进阶概念以及列表我们都掌握了,剩下的字典和集合将在下一章讲解。如果你对我的系列文章感兴趣,可以关注我的公众号。
如果你有什么问题或建议,可加我聊。