第5章〓组合数据类型 组合数据类型能够将多个同类型或不同类型的数据组织起来,通过单一的表示使数据操作更有序、更容易。根据数据之间的关系,组合数据类型分为三大类,分别是集合类型、序列类型和映射类型。本章将通过具体案例详细介绍列表类型、元组类型、字典类型、集合类型以及迭代,并通过5个综合课业任务对组合数据类型的应用进行实例演示。 【教学目标】  了解集合常量并掌握集合的交并差集运算  了解列表、元组、字典、集合的区别  了解迭代器与可迭代对象  掌握列表的常用方法和操作  掌握字典的访问与遍历  熟练掌握元组的访问与基本操作  熟练迭代器的基本操作 【课业任务】 王小明想使用Django+百度翻译API开发一个智能语音识别与翻译平台,Django是一个开放源代码的Web应用框架,由Python写成。在学习完程序控制结构后,需要使用组合数据类型对数据进行存储操作,现通过5个课业任务来完成。 课业任务5.1使用列表类型随机分配办公室 课业任务5.2使用元组推导式遍历出元组中的奇数 课业任务5.3使用字典数据类型编写用户登录程序 课业任务5.4使用集合数据类型对重复元素进行判定 课业任务5.5使用迭代器实现输出斐波那契数列 5.1列表类型 5.1.1列表的特点 列表是一个有序序列,属于序列类型,可以通过位置偏移量执行索引和分片操作,具有可变性,列表的长度、元素的值可改变,即可添加或删除列表成员,以及修改列表中的值,列表还可以包含任意类型的对象,如数字、字符串、列表、元组或其他对象。 5.1.2常用列表方法和操作 1. 列表的创建 可以使用列表常量或list()函数创建列表对象。 案例5.1分别使用列表常量和list()函数创建列表,示例代码如下。 # 使用列表常量创建列表 li=[ ] print(li) #使用list()函数创建列表 print(list(range(10,20,2))) # 创建数值列表对象 图5.1案例5.1执行结果 执行上述代码,结果如图5.1所示。 2. 列表的删除 可以使用del语句或clear语句将整个列表或列表中的元素删除。 案例5.2使用del语句删除整个列表,示例代码如下。 v = ['Python'] del v print(v) 执行上述代码,结果如图5.2所示。 案例5.3使用del语句删除列表中的元素,示例代码如下。 v = ['Python','php','C','C++'] # 创建列表 del v[0] # 删除索引值为0的元素 print(v) # 输出 执行上述代码,结果如图5.3所示。 图5.2案例5.2执行结果 图5.3案例5.3执行结果 案例5.4使用clear语句删除指定列表中的元素,示例代码如下。 x = [1,2,3,3,4] print(x) # 删除指定元素 x.remove(3) # 删除元素3 print(x) # 使用clear语句 x = [1,2,3,4] x.clear() # 删除全部数据 print(x) # 输出 图5.4案例5.4执行结果 执行上述代码,结果如图5.4所示。 3. 添加列表元素 添加单个数据: 可使用append()方法在列表末尾添加单个数据。 添加多个数据: 可使用extend()方法在列表末尾添加多个数据,参数为可迭代对象。 案例5.5使用append()和extend()方法添加列表元素,示例代码如下。 # 使用append()方法 x = [1,2] x.append('python') # 添加单个数据 print('添加单个元素',x) y = [3,4] # 使用extend()方法 y.extend(['a','b','c']) # 列表对象作为参数 print('添加多个元素',y) y.extend('ege') # 字符串作为参数时,每个字符串作为一个数据 print(y) 图5.5案例5.5执行结果 执行上述代码,结果如图5.5所示。 4. 修改列表元素 修改列表中的元素,只需要通过索引获取该元素,然后为其重新赋值即可。 案例5.6修改列表中的元素,示例代码如下。 x = ['E','G','C'] print('修改前:',x) x[1] = 'F' # 修改列表中索引值为1的元素 print('修改后:',x) 图5.6案例5.6执行结果 执行上述代码,结果如图5.6所示。 5. 统计计算 使用count()方法可以获取指定列表中元素的出现次数。 使用index()方法可以获取指定元素在列表中首次出现的位置(即索引)。 案例5.7count()方法的应用,示例代码如下。 x = ['Python','Php','C#','Python'] # 创建列表 num = x.count('Python') # 获取指定元素出现的次数 print('Python出现的个数:',num) # 输出次数 执行上述代码,结果如图5.7所示。 案例5.8index()方法的应用,示例代码如下。 x=['Html','Python','Java','C'] # 创建列表 position = x.index('Python') # 获取指定元素首次出现的索引 print('Python所在的索引值:',position) # 输出索引 执行上述代码,结果如图5.8所示。 图5.7案例5.7执行结果 图5.8案例5.8执行结果 6. 排序 使用sort()方法可将列表排序,若列表对象全部是数字,则按数字从小到大排序; 若列表对象全部是字符串,则按字典顺序排序(先对大写字母排序,再对小写字母排序)。 案例5.9sort()方法排序的应用,示例代码如下。 # 对数字列表排序 x = [88,25,98,45,20,14,1,6] x.sort() # 使用sort()方法进行排序 print(x) # 对字符串列表排序 y = ['abh', 'Abc', 'BBC', 'CBD'] y.sort() # 使用sort()方法进行排序 print(y) 执行上述代码,结果如图5.9所示。 说明: 若列表中元素包含多种类型,使用sort()方法排序则会出错。 案例5.10sort()方法与reverse结合使用进行排序,示例代码如下。 # 从大到小排序 x = [78,5,45,8] x.sort(reverse = True) print(x) 执行上述代码,结果如图5.10所示。 图5.9案例5.9执行结果 图5.10案例5.10执行结果 5.1.3列表推导式 列表推导式是Python构建列表的一种快捷方式,可以使用简洁的代码创建一个列表,相当于用for循环创建列表的简化版。 案例5.11使用列表推导式和for循环创建列表的对比,示例代码如下。 # for循环 list_a = list() for a in range(5): list_a.append(a) print("使用for循环:",list_a) # 列表推导式 list_b = [b for b in range(5)] print("使用列表推导式:",list_b) 执行上述代码,结果如图5.11所示。 在面对一些比较复杂的循环中,我们可以使用列表推导式去解决,列表推导式比常规循环运行速度更快、更简洁。 案例5.12列表推导式的应用,示例代码如下。 # 常规循环 result=[ ] # 创建空列表 for x in list(range(3,4)): for y in list(range(3,4)): for z in list(range(3,4)): result.append(x**z**y) # 进行3次循环,求出x的z次方的y次方 print(result) #使用列表推导式 result1=[x**z**y for x in list(range(3,4)) for y in list(range(3,4)) for z in list(range(3,4))] print(result1) 执行上述代码,结果如图5.12所示。 图5.11案例5.11执行结果 图5.12案例5.12执行结果 5.2元组类型 5.2.1元组的特点 元组是Python的一种常用数据类型,与列表类似,也是一个序列类型。不同之处在于元组的元素不能修改; 表达形式上,元组使用圆括号,列表使用方括号。 元组的优点是占用内存小、处理速度快、具有不可变性(不可修改元素)。 5.2.2创建和删除元组 1. 创建元组 在Python中可以用括号或tuple()函数创建元组,可以输入多个对象,把输入的对象作为元素加入元组中。 案例5.13使用括号创建元组,示例代码如下。 tup0=() tup1=(4,9,7,78) tup2=("a","c","b") # 这种情况可以不使用括号 tup3="A","B","C" print(tup0) print(tup1) print(tup2) print(type(tup3)) # 使用type()函数查看类型 执行上述代码,结果如图5.13所示。 当元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符。 案例5.14创建只有一个元素的元组,示例代码如下。 tuple1= ('a',) # 创建只有一个元素的元组时,必须带有逗号 tuple2= ('a') # 创建只有一个元素的元组时,不带逗号会变成str类型 print(type(tuple1)) # 输出 print(type(tuple2)) # 输出 执行上述代码,结果如图5.14所示。 图5.13案例5.13执行结果 图5.14案例5.14执行结果 2. 删除元组 在Python中,对于已经创建的元组,不再使用时,可以使用del语句进行删除,但是不能删除元组中某个元素。 案例5.15使用del语句删除元组,示例代码如下。 tuple1=(8,7,1) # 创建元组 del tuple1 # 使用del语句删除元组 print(tuple1) # 输出 执行上述代码,结果如图5.15所示。 图5.15案例5.15执行结果 5.2.3元组的访问与操作 元组访问分别为索引访问和切片操作。 元组的操作分别为连接操作、成员关系操作、比较运算操作、计数操作。 1. 索引访问 使用索引可以访问元组中指定位置的元素。 案例5.16索引访问的应用,示例代码如下。 # 正索引 tuple = ("Python","list","dict") print('tuple索引值为1是:',tuple[1]) # 取出索引值为1的元素 # 负索引 tuple = ("Python","list","dict") print("tuple索引值为-1是:",tuple[-1]) # 取出索引值为-1的元素 执行上述代码,结果如图5.16所示。 图5.16案例5.16执行结果 2. 切片操作 元组中的切片取值遵守“左闭右开”的规则。例如,当切片为[9∶15]时,则取不到索引为15的值。 案例5.17切片操作的应用,示例代码如下。 tuple0=(99,88,77,66,55,44,33) # 创建元组 tuple1=tuple0[1:5] # 左闭右开 print(tuple1) # 输出 图5.17案例5.17执行结果 执行上述代码,结果如图5.17所示。 3. 连接操作 元组中的元素值是不可修改的,但是可以对元组进行连接组合。 (1) 使用*符号进行重复拼接操作。 案例5.18使用*符号进行连接,示例代码如下。 A=('php','good') print(A*2) 执行上述代码,结果如图5.18所示。 (2) 使用+符号进行重复拼接操作。 案例5.19使用+符号进行拼接操作,示例代码如下。 tuple1=(1,2,3,4) tuple2=("Hello啊","5678","Hi","9,10,11,12") print(tuple1+tuple2) 执行上述代码,结果如图5.19所示。 图5.18案例5.18执行结果 图5.19案例5.19执行结果 4. 成员关系操作 成员关系操作主要是in和not in运算符操作。对于in运算符,如果元组中包含给定的元素,则返回 True,否则返回False; 对于not in运算符,如果指定元素不在元组中,则返回True,否则返回False。 案例5.20in和not in运算符的应用,示例代码如下。 tuple0=(65,"five","nice") print("five"in tuple0) print("中国"not in tuple0) print("65"in tuple0) print("nice"not in tuple0) 执行上述代码,结果如图5.20所示。 图5.20案例5.20执行结果 5. 比较运算操作 元组之间可以通过>、<、>=、<=等运算符进行比较运算,数字类型的比较是从两个元组的第1个元素开始比较大小的,如t4=(1,2),t5=(2,2),则t5>t4; 字符串类型的比较是以26个英文字母的顺序作为比较方式,字母顺序越靠后越大,另外,小写字母大于大写字母。 案例5.21比较元组的操作,示例代码如下。 t0=(1,2,3) t1=(1,3,2) print(t0