1.2.5节使用了变量存储同学cathy的个人信息,但是如果她的个人信息很多,就需要定义更多的变量来存储,这就会产生以下问题:
·变量定义多,容易混淆。
·数据各自独立,没有关联性。
·代码量大。
·可读性不强。
使用Python容器就可以解决上述问题。容器可以用来盛放一组相关联的数据,并对数据进行统一的功能操作。容器主要分为列表(list)、字典(dict)和元组(tuple),这些结构和其他语言中的类似结构本质上是相同的,但Python容器更简单、更强大。
列表是一组元素的集合,可以实现元素的添加、删除、修改和查找等操作。现将同学cathy的个人信息统一放到列表中,代码如下:
cathy = ["cathy",10,138.5,True,None] #cathy的个人信息 score = [90,100,98,95] #各科成绩 name = list("cathy") #利用list()函数初始化一个列表 print(name) #输出结果:['c', 'a', 't', 'h', 'y']
【重点说明】
·列表内的元素用方括号([ ])包裹。
·列表内不同元素之间使用逗号(,)分隔。
·列表内可以包含任何数据类型,也可以包含另一个列表。
·可以使用list()函数生成一个列表。
可以使用列表自带的方法实现列表的访问、增加、删除和倒序等操作。仔细阅读以下代码及注释。
cathy = ["cathy",10,138.5,True,None] #cathy的个人信息 a = cathy[0] #下标法获取第1个元素(姓名):cathy b = cathy[1:3] #使用切片获取下标1到下标3之前的子序列:[10, 138.5] c = cathy[1:-2] #切片下标也可以倒着数,-1对应最后一个元素:[10, 138.5] d = cathy[:3] #获取从开始到下标3之前的子序列:['cathy', 10, 138.5] e = cathy[2:] #获取下标2开始到结尾的子序列:[138.5, True, None] cathy[2] = 140.2 #将第3个元素修改为140.2 10 in cathy #判断10是否在列表中,True cathy.append(28) #将体重添加到列表末尾 print(cathy) #['cathy', 10, 140.2, True, None, 28] cathy.insert(2,"中国") #将国籍插入到第2个元素之后 print(cathy) #['cathy', 10, '中国', 140.2, True, None, 28] cathy.pop() #默认删除最后一个元素 print(cathy) #['cathy', 10, '中国', 140.2, True, None] cathy.remove(10) #删除第1个符合条件的元素 print(cathy) #['cathy', '中国', 140.2, True, None] cathy.reverse() #倒序 print(cathy) #[None, True, 140.2, '中国', 'cathy']
现在要使用列表存储另一个同学terry的信息,已知除了姓名以外,其他的信息跟cathy一样。通过以下操作就可以得到同学terry的列表。
#cathy的个人信息 cathy_list = ["cathy",10,138.5,True,None] terry_list = cathy_list #将cathy_list赋给变量terry_list terry_list[0] = "terry" #修改terry的姓名 print(terry_list) #打印terry信息:['terry', 10, 138.5, True, None] print(cathy_list) #打印cathy信息:['terry', 10, 138.5, True, None]
和大家的预期不同的是,cathy_list中的姓名也变成terry了,但是我们并未修改cathy_list的姓名,这是什么原因呢?原来在执行terry_list=cathy_list时,程序并不会将cathy_list的值复制一遍,然后赋给terry_list,而是简单地为cathy_list的值即["cathy",10,138.5,True,None]建立了一个引用,相当于cathy_list和terry_list都是指向同一个值的指针,所以当terry_list中的值改变后,cathy_list的值也会跟着变。可以通过id()函数来获取变量的地址。实现代码如下:
print(id(cathy_list)) #获取cathy_list的地址:2011809417032 print(id(terry_list)) #获取terry_list的地址:2011809417032
结果显示,cathy_list和terry_list这两个变量均指向同一个地址。如何解决这个问题呢?可以使用copy()函数将值复制一份,再赋给terry_list,实现代码如下:
#terry_list = cathy_list #删除该条语句 terry_list = cathy_list.copy() #将值复制一份赋给变量terry_list
将同学cathy各科的成绩保存于列表score中,实现代码如下:
score = [90,100,98,95] #成绩
如果想要获取cathy的语文成绩,如何做到呢?除非事先将每门课的位置都做了记录,否则无论如何是获取不到语文成绩的。当需要对数据做明确的标注,以供别人理解和处理时,使用列表就不太方便了,这时字典就派上用场了。
字典是一种非常常见的“键-值”(key-value)映射结构,它为每一个元素分配了一个唯一的key,你无须关心位置,通过key就可以获取对应的值。下面来看一下使用字典保存的成绩:
score1 = {"math":90,"chinese":100,"english":98,"PE":95} #成绩字典 print(score1["chinese"])
【重点说明】
·字典内的元素用大括号({})包裹。
·使用key:value的形式存储一个元素,如"math":90,字符串math是分数90的key。
·字典内不同键值对之间采用逗号(,)分隔。
·字典是无序的,字典中的元素是通过key来访问的,如score1["chinese"]得到语文成绩。
也可以使用dict()函数初始化字典,实现代码如下:
score2 = dict(math=90,chinese=100,english=98,PE=95) print(score1["chinese"]) #根据key获取语文成绩:100 if "PE" in score1: #判断字典中是否包含"PE"的key print(score1["PE"]) #得到体育成绩:95 #获取所有的key并保存于列表中,输出结果:['math', 'chinese', 'english', 'PE'] print(score1.keys()) #获取所有的value并保存于列表中,输出结果:[90, 100, 98, 95] print(score1.values()) #获取key和value对转化为列表 #输出结果:[('math', 90), ('chinese', 100), ('english', 98), ('PE', 95)] print(score1.items())
元组和列表最大的区别就是不可变的特性,即元组的值一旦确定了,就无法进行任何改动,包括修改、新增和删除。
sex1 = ("male","female") #使用括号生成并初始化元组 sex2 = tuple(["male","female"]) #从列表初始化 sex3 = ("male",) #只有一个元素时,后面也要加逗号 sex4 = "male","female" #默认是元组类型("male","female")
【重点说明】
·元组中元素的访问方法和列表一样,都可以使用下标和切片。
·圆括号(( ))表示元组,方括号([ ])代表列表,大括号({ })代表字典。
·初始化只包含一个元素的元组时,也必须在元素后加上逗号,如sex3。
·直接用逗号分隔多个元素的赋值默认是元组,如变量sex4。
·元组内的数据一旦被初始化,就不能更改。
for循环用于遍历一个对象集合,依次访问集合中的每个项目。前面提到的列表、字典和元组,均可通过for循环遍历。下面来看几个例子。
1.遍历列表
cathy = ["cathy",10,138.5,True,None] #依次输出:"cathy",10,138.5,True,None for a in cathy: print(a)
可以通过下标遍历列表。用len()函数获得列表长度,再用range()函数获得所有下标的集合,实现代码如下:
#依次输出:"cathy",10,138.5,True,None for i in range(len(cathy)): print(cathy[i])
2.遍历字典
score = {"math":90,"chinese":100,"english":98,"PE":95} #成绩字典 #键的遍历,不按顺序输出:"math","chinese","english","PE" for key in score: print(key) #键和值的遍历,不按顺序输出:math : 90,chinese : 100,english : 98,PE : 95 for key,value in score.items(): print(key,":",value)
程序如果执行多次,会发现输出的顺序不一定一致,这是因为字典是无序的。
3.遍历元组
sex = ("male","female") #依次输出:"male","female" for b in sex: print(b)