第3章〓数据类型 早期计算机主要用来处理各种数值计算问题。但是,计算机能处理的信息远不止数值,还可以处理文本、图形、音频、视频等各种数据。为了解决这些数据之间的转换、存储和计算,需要将不同数据定义为不同的数据类型。 3.1数据类型——主要类型和特征 1. Python的基本数据类型 Python中的数据类型根据运算方法大体分为五种,一是数值类,如整数、浮点数、复数; 二是字符串类,如字母、符号、汉字等; 三是布尔类; 四是混合类,包括数值和字符串,如列表、元组、集合、布尔值; 五是字节类,主要用于二进制字节文件。Python主要数据类型如表31所示。 表31Python主要数据类型 数据类型 名称 说明 示例 int 整数 精度无限制,整数有效位可达数万位 0、50、-56789等 float 浮点数 精度无限制,默认16位,精度可扩展 3.1415927、5.0等 complex 复数 注意,复数的虚数部分用“j”表示 3+2.7j str 字符 由字符组成的不可修改元素,无长度限制 'hello'、'提示信息'等 list 列表 多种类型的可修改元素,最多5.3亿个元素 [4.0, '名称', True] tuple 元组 多种类型的不可修改元素 (4.0, '名称', True) dict 字典 由“键值对”(用:分隔)组成的有序元素 {'姓名':'张飞', '年龄':30} set 集合 无序且不重复的元素集合 {4.0, '名称', True} bool 布尔值 逻辑运算的值为True(真)或False(假) a>b and b>c bytes 字节码 由二进制字节组成的不可修改元素 b'\xe5\xa5\xbd' 2. 数据类型定义 Python中变量的数据类型不需要在程序头部预先定义,变量赋值就是变量定义过程。如果变量没有赋值,则Python认为该变量不存在。 【例31】不同数据类型混用将造成程序运行错误,程序如下。 >>>x = 123# 变量x赋值为数字 >>>y = '456'# 变量y赋值为字符串 >>>x + y# 不同数据类型混合运算 Traceback (most recent call last):…# 抛出异常信息(输出略) >>>x + z# 变量z没有赋值,Python认为该变量不存在 Traceback (most recent call last):…# 抛出异常信息(输出略) 3. 课程扩展: 数据类型的特点 Python主要数据类型的特点如表32所示。 表32Python主要数据类型的特点 数 据 操 作 字符串 列表 元组 字典 数据定义 s1='开卷有益' c1=[1,2,3,4,5] t1=(1,2,3,4,5) d1={'a':1, 'b':2, 'c':3} 数据类型混用 不可 可以 可以 可以 元素索引号 有 有 有 无 访问单个元素 s2=s1[2] c2=c1[2] t2=t1[2] d2=d1['a'] 访问多个元素 s3=s1[0:2] c3=c1[0:2] t3=t1[0:2] 不可(需要循环语句) 修改元素 不可 c1[0]=8 不可 d1['c']=8 添加元素 不可 c1.insert(0, 'ID') 不可 d1['d']=10 删除元素 不可 c1.remove('ID') 不可 del d1['c'] 4. 课程扩展: 实际问题的数据分类 程序设计中会遇到很多实际问题,它们无法用程序语言定义的数据类型进行表示,如学生的性别、成绩的优良中差、地区的东南西北等。这些数据不便于程序处理,我们需要对这些数据进行合适的分类,根据不同的数据类型选用相应的处理方法。 (1) 定类数据。定类数据是指按照事物的某种属性对数据进行分类或分组。定类数据只能表示数据类别的差异,不能比较各类数据之间的大小,数据之间没有顺序或等级关系。定类数据只能计算数据频率,不能进行数据大小比较。例如,在统计男生和女生占总人数的比例时,可以将男生编码为1,女生编码为2,这里的1、2只表示数据类别不同,没有次序关系,这样就可以在程序中计算男生或女生的比例。其他应用案例如地区类型分为东部、中部、西部等。定类数据的应用参见案例9,程序中用数字1表示选择“认罪”,数字2表示选择“不认罪”; 也可以参见案例33,程序中用数字1、2表示平声,用数字3、4表示仄声。 (2) 定序数据。定序是对事物之间等级或顺序差别的一种测度,用数字表示个体在某个有序状态中所处的位置。定序数据可以比较优劣或排序。定序数据不仅含有类别信息,还包含了次序信息。定序数据只能排序和比较,不能进行算术运算。例如,调查者对某事物的态度有同意、不同意、不发表意见等,可以通过程序计算同意的人数和比例,也可以对这些数据进行排序; 学历数据可以分为小学、初中、高中、本科、研究生等; 企业产品的销售额可以分为盈利、持平、亏损等。定序数据的应用参见案例5。 3.2数值——整数和浮点数的运算 1. 整数 Python中的整数包括正整数和负整数,Python支持大整数运算。32位Python版本默认最大整数为231-1=2147483647; 64位Python版本为263-1=9223372036854775807。当整数值域超出这个范围时,Python会自动转换为大整数计算(任意精度),整数有效位可达数万位(受操作系统内存管理的限制)。 【例32】Python默认最大整数如下所示,超过默认值时,Python会自动扩大位数。 >>>import sys# 导入标准模块 >>>sys.maxsize# 查看最大整数默认值 9223372036854775807 >>>123**100# 自动转为大整数运算(**为指数运算) 9783880597…# 输出一个209位有效数字的大整数(输出略) 2. 浮点数的概念 浮点数就是带小数点的实数。Python中,浮点数默认精度为小数点后16位,采用浮点数精度设置函数时,精度仅受内存大小限制。整数与浮点数的存储方式和计算方式都不同,浮点数采用IEEE 754标准规定方法存储。在CPU(中央处理单元)中,整数由算术逻辑单元(ALU)执行运算,浮点数由浮点处理单元(FPU)执行运算。 3. 科学记数法 科学记数法以紧凑格式表示非常大或者非常小的数字。科学记数法用字母e或者E作为幂的符号,以10为基数(底数),后面紧跟的数表示多少次幂(可正可负)。 【例33】数值6100000=6.1×106,科学记数法为6.1e+06(e后面最少两位)。 【例34】数值0.000006=6.0×10-6,科学记数法为6e-06。 【例35】Python默认最大和最小浮点数以及浮点数除法运算的程序如下: >>>import sys# 导入标准模块 >>>sys.float_info.min# 系统定义的初始最大浮点数有效位 2.2250738585072014e-308# 说明:2.2e-308表示2.2×10-308 >>>25/7 3.571485714285716# 除法运算时,Python自动将运算结果转为浮点数 >>>0.1+0.2# 数值二-十进制转换时会产生截断误差 0.30000000000000004# 浮点数的精度为小数点后16位 >>>a = 6.1e+06# 用科学记数法给变量赋值 >>>a 6100000.0 3.3字符串——最常用的数据类型 1. 字符串定义 字符串是以单引号、双引号或三引号引起来的符号,字符串中的符号称为元素,元素可以是数字、字母、汉字等。Python对字符串长度没有限制。字符串定义方法如下。 (1) 字符串必须用引号引起来,单引号(见例36)、双引号(见例37)、三引号(见例37)都行,但是引号必须成对使用。引号是一种分隔符,不是字符串的一部分。 (2) 字符串内部有单引号时,外部必须用双引号,否则将导致语句错误。 (3) 语句中有特殊字符(如%)时,可在字符串前加r,使字符串保持原样。 【例36】字符串定义示例程序如下: >>>s1 = '与谁同坐,明月清风我。'# 定义字符串(两个单引号为字符串定义符) >>>s1# 打印字符串 '与谁同坐,明月清风我。' >>>s2 = '与谁同坐,''明月清风我。'# 字符串用空格分隔时,属于同一个字符串 >>>s2# 打印字符串 '与谁同坐,明月清风我。' >>>s3 = '与谁同坐,', '明月清风我。'# 字符串用逗号分隔时,自动转换为元组 >>>s3# 打印元组 ('与谁同坐,', '明月清风我。') 【例37】长字符串的定义,程序如下: >>>URL = ['https://mp.csdn.net/mp_blog/'# 变量名URL为网址 …'creation/editor/126873850']# 引号前空格不影响正确性 >>>URL# 打印网址 ['https://mp.csdn.net/mp_blog/creation/editor/126873850'] >>>poetry = '''# 用三引号定义字符串 …[宋] 苏轼《花影》# 变量名poetry为诗歌 …重重叠叠上瑶台, …几度呼童扫不开, …刚被太阳收拾去, …却教明月送将来。 …''' >>>path = r"path = /% '相对路径' ../n"# 引号外的r表示引号内 >>>path# 的字符串按原样输出 "path = /% '相对路径' ../n" 2. 字符串索引号 字符串有两种索引方式,一是正向索引号(或称为下标),从0开始,从左往右读取; 二是起始索引号从-1开始,从右往左逆序读取。 【例38】字符串s = '与谁同坐,明月清风我',索引号如图31所示。 图31字符串中元素的索引号 3. 字符串切片方法 字符串切片就是读取字符串中的某些字符,字符串切片语法如下: 1 变量名[起始索引号:终止索引号:步长] (1) 括号[ ]里的数字为索引号,没有冒号时表示读取单个元素。 (2) 正向切片时,起始索引号为0; 负向切片时,起始索引号为-1。 (3) 正向切片时,终止索引号为右边最后一个字符的索引号。 (4) 步长表示切片时每次跳过几个元素,没有步长参数时,表示逐个读取元素。如s[0:9:2]表示在索引号0~9的元素中,读取索引号为0、2、4、6、8的元素。正数步长表示从左往右切片,负数步长表示从右到左切片。 【例39】字符串正向切片程序如下: >>>s = '与谁同坐,明月清风我' >>>s[:]# 切片所有元素 '与谁同坐,明月清风我' >>>s[0:4]# 切片前面4个元素 '与谁同坐' >>>s[4:]# 切片索引号4后的元素 ',明月清风我' >>>s[::2]# 切片步长为2的元素 '与同,月风' >>>s[4:2]# 起点大于终点,越界错误 ''# 输出为空 【例310】字符串反向切片程序如下: >>>s ='与谁同坐,明月清风我' >>>s[-3:]# 切片索引号-3起始的元素 '清风我' >>>s[:-3]# 切片起始到-3的元素 '与谁同坐,明月' >>>s[-5:-3]# 切片索引号-5到-3的元素 '明月' >>>s[::-2]# 切片步长为-2的元素 '我清明坐谁' >>>s[-4:-6]# 起大于终,越界错误 ''# 输出为空 字符串切片时,只是读取了字符串的一部分,并没有改变源字符串,因为字符串是不可改变的。但是可以将切片的字符赋值给一个新的变量,形成新字符串。 4. 字符串切片函数: split() 函数split()可以对字符串切片,并以列表的形式返回,函数语法如下: 1 split('切分符', 切分次数)[n] (1) 参数“'切分符'”为空格、逗号、换行符等。不带参数时默认以空格进行切分。 (2) 参数“切分次数”为可选参数,默认为-1,即对整个字符串进行切分。 (3) 参数“[n]”为切分第n个字符,正数从左向右切分,负数时从右向左切分。 (4) 返回值: 函数返回切分后的字符串列表(注意: 切分不会改变源字符串)。 【例311】对字符串“百度 www.baidu.com”进行各种切分,程序如下: >>>s = '百度 www.baidu.com'# 定义字符串变量 >>>s.split(' ')# 空格切分符(默认),对字符串按空格切分 ['百度', 'www.baidu.com']# 切分为两个元素 >>>s.split('.')# 点切分符,对字符串按点切分 ['百度 www', 'baidu', 'com']# 切分为3个元素,'百度 www'为同一个元素 >>>s.split('.', 3)[1]# 点切分符,切分3次,[1]为切片左起第2个元素 'baidu' >>>s.split('.')[-2]# 点切分符,全部切分,[-2]为切片右起第2个元素 'baidu' >>>s.split()[1]# 空切分符,全部切分,[1]为切片左起第2个元素 'www.baidu.com' 5. 字符串连接函数: join() 函数join()用于两个字符串的连接,它是函数split()的逆方法,语法如下: 1 newstr ='分隔符'.join('字符串') (1) 参数“'分隔符'”为字符串合并时,用于分隔的符号,如空格、点号、冒号等。 (2) 参数“序列”为合并操作的源字符串,如字符串、列表、元组、字典等。 (3) 返回值newstr为连接后带分隔符的新字符串。 【例312】对字符串进行连接(生成新字符串),程序如下: >>>s1 = '青山相待,'# 定义字符串 >>>s2 = '白云相爱。'# 定义字符串 >>>s1+s2# 字符串连接 '青山相待,白云相爱。' >>>path = 'D:\\test\\资源\\'# 定义字符串 >>>print(path+''.join('琴诗.txt'))# 合并字符串,分隔符''为两个单引号 D:\test\资源\琴诗.txt >>>URL = ['www','baidu','com']# 定义字符串 >>>'.'.join(URL)# 用点号(.)进行字符串分隔 'www.baidu.com' 6. 删除首尾字符函数: strip() 【例313】s1='7. 删除首尾指定字符\n',将字符串“7.”删除,程序如下: >>>s1 = '7.删除首尾指定字符\n'# 为字符串变量s1赋值 >>>s2 = s1.strip('7. ')# 删除字符串s1中的“'7.'” >>>s3 = s2.strip('\n')# 删除字符串尾部的换行符“'\n'” 说明: 函数strip()不能删除字符串中间的空格或字符。 7. 字符串长度计算函数: len() 【例314】字符串长度计算,程序如下: >>>s = '故乡一望一心酸'# 为字符串变量s赋值 >>>len(s)# 计算字符串长度 7 3.4列表——功能强大的数据类型 列表是一种功能强大的数据类型,列表中元素的数据类型可以相同或不相同,元素可以是数字、字符串、元组、字典等,或者它们的混合体。32位Python中列表元素最多为229=536 870 912个,而且每个元素的大小没有限制。 1. 列表的索引号 列表中每个元素都有一个索引号,索引号在C、Java等语言中称为数组下标。元素可以通过索引号进行访问(读写)或遍历(顺序访问其中每个元素)。索引分为正向索引和反向索引。正向索引中,第1个元素索引号为0,第2个元素索引号为1,其余以此类推; 反向索引中,最后1个元素索引号为-1,其余以此类推。 【例315】列表lst=['枯藤', '老树', '昏鸦', '小桥流水人家'],索引号如图32所示。 图32列表中元素的索引号 2. 定义列表 列表中的元素用方括号[ ]括起来,元素之间以英文逗号分隔。列表元素可以是Python支持的任意数据类型,如数字、字符串、布尔值、列表、元组、字典等。 列表定义和输出语法如下: 1列表名 = [元素1, 元素2, 元素3, …,元素n]# 定义列表 2列表名[索引号]# 对已定义列表,按索引号输出列表 3列表名[起始索引号:终止索引号]# 按起始和终止索引号输出列表 【例316】列表元素以逗号分隔,每个逗号之间为同一个元素,程序如下: >>>lst1 = ['枯藤', '老树', '昏鸦', '小桥流水人家']# 定义列表 >>>lst1# 打印列表 ['枯藤', '老树', '昏鸦', '小桥流水人家'] >>>lst2 = ['枯藤''老树''昏鸦', '小桥流水人家']# 元素用空格分隔时属于同一元素 >>>lst2# 打印列表 ['枯藤老树昏鸦', '小桥流水人家'] >>>lst3 = ['枯藤', '老树', '昏鸦'], ['小桥流水人家']# 列表嵌套定义时,将转换为元组 >>>lst3# 打印元组 (['枯藤', '老树', '昏鸦'], ['小桥流水人家']) >>>lst4 = ['圆周率', 3.14159, 520, True]# 列表中元素的数据类型可以混用 >>>lst4# 打印列表 ['圆周率', 3.14159, 520, True] 3. 列表切片语法 列表切片是指按指定顺序读取列表中某些元素,得到一个新列表,语法如下: 1 列表名[切片起始索引号:切片终止索引号:步长] 列表切片通过冒号和数字的组合来访问列表中的元素。 (1) 列表名为要进行切片的源列表。 (2) 方括号[ ]里的数字为索引号,冒号为分隔符。第一个冒号前面的数字表示起始索引号(默认为0); 第一个冒号后面的数字表示终止索引号(默认为最后一个元素); 第二个冒号后面的数字表示步长(默认为1)。没有冒号则表示对列表中的单个元素进行访问。 (3) 正向切片时,起始索引号为0; 负向切片时,起始索引号为-1。 (4) 正向切片时,终止索引号为右边最后一个字符的索引号; 负向切片时,终止索引号为左边最后一个字符的索引号。 (5) 步长表示切片时每次跳过几个元素,没有步长参数时,表示逐个读取元素(即步长默认值为1)。如lst[0:3:2]表示在索引号为0~3的元素中,读取索引号为0、2的元素。正数步长表示从左往右切片,负数步长表示从右到左切片。 (6) 切片遵循“左闭右开”原则,即切片结果不包括“终止索引号”的元素。正向切片时,元素“起始索引号”要小于“终止索引号”,否则将输出空列表。 注意: 列表定义与列表切片是不同的操作,它们的区别如图33所示。 图33列表定义(左)和列表切片(右)的区别 4. 程序设计: 列表切片 【例317】lst=['宝玉', '黛玉', '宝钗', '晴雯', '王熙凤', '袭人'],列表切片如下: >>>lst = ['宝玉', '黛玉', '宝钗', '晴雯', '王熙凤', '袭人']# 定义列表(符号[ ]为列表定义符) >>>lst[:]# 切片全部元素 ['宝玉', '黛玉', '宝钗', '晴雯', '王熙凤', '袭人'] >>>lst[3:]# 切片自索引号3起,至尾部 # 止,步长默认为1 ['晴雯', '王熙凤', '袭人'] >>>lst[3]# 只切片索引号为3的元素 ['晴雯'] >>>lst[1:4]# 切片自索引号1起,至索引号4 #止,步长默认为1 ['黛玉', '宝钗', '晴雯'] >>>lst[1:4:2]# 切片自索引号1起,至索引号4 # 止,步长为2 ['黛玉', '晴雯'] >>>lst[::2]# 切片自索引号0起,至尾部 # 止,步长为2 ['宝玉', '宝钗', '王熙凤'] >>>lst[::-1]# 全部元素逆序输出 ['袭人', '王熙凤', '晴雯', '宝钗', '黛玉', '宝玉'] >>>lst[-2:-5]# 切片自索引号-2起,至索引号 # -5止,越界错误 []# 输出为空 >>>lst[-5:-2]# 切片自索引号-5起,至索引号 # -2止 ['黛玉', '宝钗', '晴雯'] 注意: 切片时,如果偏移量越界(索引号超出列表最大长度),Python仍然按照最大长度处理。如切片索引号大于列表的最大长度(越界)时,Python仍然会按照最大索引号处理。 5. 在列表中添加元素 向列表中添加或从中删除元素时,Python会对列表自动进行存储大小和索引号顺序调整。为了提高程序运行效率,应当尽量从列表尾部进行元素添加或删除操作。 向列表中添加元素的函数有append()、extend()和insert(),语法如下: 1列表名.append(元素)# 在列表尾部添加1个元素 2列表名.extend([元素列表])# 在列表尾部添加多个元素 3列表名.insert(索引号, 元素)# 在列表指定位置插入元素或列表 【例318】用函数append()在列表末尾添加一个元素,程序如下: >>>lst = ['宝玉', '黛玉', '宝钗']# 定义列表lst(列表有3个元素) >>>lst.append('晴雯')# 在列表尾部添加1个元素'晴雯' >>>lst# 输出列表lst ['宝玉', '黛玉', '宝钗', '晴雯']# 列表添加元素时,列表会自动扩展 【例319】用函数extend()在列表末尾添加多个元素,程序如下: >>>lst = ['官', '君莫想']# 定义列表lst >>>lst.extend(['钱', '君莫想'])# 在列表尾部添加元素'钱'和'君莫想' >>>lst ['官', '君莫想', '钱', '君莫想'] 【例320】用函数insert()在列表指定位置插入元素,程序如下: >>>lst = ['日日', '无事事', '亦茫茫']# 定义列表lst >>>lst.insert(2, '忙忙')# 在列表索引号2的位置添加元素'忙忙' >>>lst# 输出列表 ['日日', '无事事', '忙忙, '亦茫茫'] 说明: 插入元素时,若索引号为-1,则在最后一个元素之后插入。 6. 多个列表的连接 【例321】用加法(+)连接列表,程序如下: >>>lst1 = ['寒蝉凄切', '对长亭晚']# 定义列表lst1 >>>lst2 = ['骤雨初歇']# 定义列表lst2 >>>lst1 + lst2# lst1和lst2连接 ['寒蝉凄切', '对长亭晚', '骤雨初歇']# 输出列表 7. 列表的嵌套 【例322】列表嵌套即在列表里再定义列表,程序如下: >>>lst1 = ['孙悟空', '猪八戒', '沙和尚']# 为列表lst1赋值 >>>lst2 = [1000, 700, 300]# 为列表lst2赋值 >>>lst3 = [lst1, lst2]# 连接列表lst1和lst2,形成嵌套列表lst3 >>>lst3# 输出嵌套列表lst3 [['孙悟空', '猪八戒', '沙和尚'], [1000, 700, 300]] 8. 判断列表 【例323】利用布尔函数判断列表是否为“空”,程序如下: >>>lst = [‘比人心’, ‘山未险’]# 定义列表lst >>>bool(lst)# 利用布尔函数,判断列表是否为空 True# True表示列表不为空,False表示列表为空 【例324】利用index()函数判断元素在列表中的位置,程序如下: >>>lst = ['情', '深', '深', '雨', '蒙', '蒙']# 定义列表lst >>>lst.index('蒙')# 查找字符串中元素“'蒙'”的索引号 4# 找到的第1个元素(索引号为4) >>>lst.count('深')# 统计字符串中元素“'深'”出现的次数 2 9. 修改列表中元素 修改列表元素的语法如下: 1 变量名[元素索引号]=修改内容 【例325】在列表lst中,将元素“栏杆”修改为“阑干”,程序如下: >>>lst = ['把吴钩看了', '栏杆拍遍', '无人会', '登临意']# 定义列表lst >>>lst[1] = '阑干拍遍'# 修改索引号为1的元素值 >>>lst ['把吴钩看了', '阑干拍遍', '无人会', '登临意']# 修改列表中元素 读取、删除、修改列表时,容易出现越界错误。列表切片时不提示越界错误。提示偏移量越界的操作有lst[偏移量]、del lst[偏移量]、lst.remove(值)、lst.pop(偏移量),如果偏移量越界,这些操作都会报错。 10. 删除列表元素 删除列表中指定索引号的元素,可以使用函数pop(),语法如下: 1列表名.pop(元素索引号)# 语法1 2del列表名[元素索引号]# 语法2 【例326】删除列表中指定位置元素的函数有pop()、del,程序如下: >>>lst = ['天不教人客梦安', '昨夜春寒', '今夜春寒']# 定义列表lst >>>lst.pop(2)# 删除列表中索引号为2的元素 '今夜春寒' >>>lst ['天不教人客梦安', '昨夜春寒'] >>>del lst[1]# 删除列表中索引号为1的元素 >>>lst ['天不教人客梦安'] 3.5元组——不可修改的数据类型 1. 元组定义语法 元组也是一种数据存储容器。元组与列表的区别在于元组中的元素不能修改,而列表中的元素可以修改; 元组和列表的定义符号不一样,元组使用圆括号定义,而列表使用方括号定义。元组定义语法如下: 1 元组名=(元素1, 元素2, 元素3,…,元素n) 2. 元组定义案例 【例327】定义元组的简单示例,程序如下: >>>tup1 = ('春', '风', '吹', '又', '生')# 定义元组tup1(左右两个圆括号为元组定义符) >>>tup1# 输出元组 ('春', '风', '吹', '又', '生') >>>tup2 = (12, 34, 56, 78)# 定义元组 >>>tup2# 输出元组 (12, 34, 56, 78) 元组只有一个元素时,必须在元素后面增加一个逗号(见例328)。如果没有逗号,Python会假定这只是一对额外的圆括号,不会定义一个元组。 在不引起语法错误的情况下,可以用逗号分隔的一组值定义元组(见例328第2行)。也就是说,在没有歧义的情况下,元组可以没有括号。 【例328】元组的特殊定义方法,程序如下: >>>tup1 = (0,)# 元组为单个元素时,必须加逗号以防出错 >>>tup2 = 1, 2, 3, 4, 5# 定义元组时,可以省略圆括号() >>>tup2# 输出元组 (1, 2, 3, 4, 5) 3. 元组切片方法 元组切片方式与列表相同,元组索引号也与列表相同。元组访问语法如下: 1 元组名[索引号] 【例329】切片访问元组中的某个元素,程序如下: >>>tup1 = ('月', '是', '故', '乡', '明')# 定义元组tup1 >>>tup1[2]# 访问元组中第3个元素(元组可读不可写) '故' >>>tup2 = (1, 2, 3, 4, 5)# 定义元组tup2 >>>tup2[2]# 访问元组中第3个元素 3 3.6字典——键值对数据类型 1. 字典的特征 字典是Python中一种重要的数据结构。字典中每个元素分为两部分,前半部分称为“键”(key),后半部分称为“值”(value)。例如{'姓名':'张飞'}元素中,“姓名”称为“键”,“张飞”称为“值”,它们一起称为“键值对”。字典是“键值对”元素的集合。字典类似于表格中的一行(记录),“键”相当于表格的字段名称; “值”相当于表格单元格中的值。 列表、元组、字典都是有序对象集合。它们之间的区别在于字典中的元素通过“键”进行查找,而列表中的元素通过索引号进行查找。 2. 字典定义语法 字典中每个“键值对”(keyvalue)用冒号“:”分隔,每个“键值对”之间用逗号(,)分隔,整个字典包含在花括号{ }中(见图34)。字典定义语法如下: 1 字典名={键1:值1, 键2:值2, …,键k:值v} 图34字典案例示意图 字典中,键可以是字符串、数字、元组等数据类型。键不能重复,如果键有重复,最后一个键值对会替换前面的键值对; 值可以重复; 键和值的数据类型没有限制。 3. 字典定义案例 【例330】定义字典的各种方法示例,程序如下: >>>dict1 = {'姓名':'张飞', '战斗力':1000}# “'姓名'”是键,“'张飞'”是值,它们是键值对 >>>dict2 = {'宝玉':82, '黛玉':85}# 同一字典中,键不能重复,值允许重复 >>>dict2['宝钗'] = 88# 在字典dict2中添加一个键值对{'宝钗':88} >>>dict3 = {(80, 90):'优良', 60:'及格'}# 键也可以是元组,如(80, 90) 可以通过字典中的“键”查找字典中的“值”。 4. 访问字典元素 字典中元素虽然是有序的(Python 3.6以后的版本),但是字典中的元素没有索引号,因此访问字典中的元素可以由键查找值。字典访问语法如下: 1 字典名[键名] 【例331】在字典中读取人物身高信息,程序如下: >>>people = {'姓名':'张飞', '性别':'男', '身高':'180cm'} >>>people['身高']# 访问字典,由键查找值 '180cm' 5. 修改字典中的元素 修改字典是指添加新键值对、修改或删除已有键值对。 【例332】向字典中添加新内容,程序如下: 1dict1 = {'姓名':'关云长', '年龄':40, '战斗力':'一级'}# 定义字典 2dict1['年龄'] = 48# 修改字典条目 3dict1['宝贝'] = '赤兔马'# 尾部新增键值对 4print('字典:', dict1)# 输出字典 >>> 字典:{'姓名': '关云长', '年龄': 48, '战斗力': '一级', '宝贝': '赤兔马'}# 程序输出 6. 程序设计: 成绩统计序列输出 【例333】某班成绩如表33所示,用字典数据类型输出学生成绩。 表33某班考试成绩(部分) 姓名 语文 数学 周小碧 85 92 秦天际 76 55 韩织烟 92 88 输出学生成绩程序如下: 1students = [# 定义列表 2{'姓名': '周小碧', '语文': 85, '数学': 92},# 定义字典 3{'姓名': '秦天际', '语文': 76, '数学': 55}, 4{'姓名': '韩织烟', '语文': 92, '数学': 88}, 5] 6print('考试成绩如下:', students)# 打印输出 >>> 考试成绩如下:[{'姓名': '周小碧', '语文': 85,…# 程序输出(略) 说明: 平均成绩计算参见案例6。