资源简介 (共99张PPT)Python少儿编程第四章 形形色色的数据容器目录1.1通用系列1.2百变字符串1.3会魔法的列表1.4被束缚了的元组1.5有身份的字典1.6独一无二的集合PART 01通用序列索引1.1序列中的所有元素都可以通过索引(下标)来获取,从左往右,第一个元素的索引为0,第二个为1,依此类推到最后一位。索引还可以取负值,从右往左,最后一个元素的索引为 1,倒数第二个为 2,依此类推到左侧第一位。例如,创建字符串“str1='Python'”,其索引如表4-1所示。表4-1 字符串str1的索引由表4-1可知,str1[0]和str1[ 6]的值都是字符“P”。还可使用序列字面值直接使用索引,如'Python'[0]的值也是字符“P”。分片1.2分片与索引类似,都可以获取序列中的元素,区别是索引只能获取单个元素,而分片可以获取一定范围内的元素。分片通过冒号隔开的两个索引来实现,其语法格式如下。slice[start:end:step]其中,slice表示序列;start表示起始索引,缺省时分片从序列中的第一个元素开始;end表示结束索引(不含),缺省时分片到序列的最后一个元素结束;step表示步长,缺省时为1,不能为0。例如,创建字符串“str2='abcdefg'”,使用分片获取字符串中元素的几种情况如表4-2所示。分片1.2表4-2 分片获取字符串str2中元素分片1.2Python中步长不能设置为0,但可以是负数。当步长为负数时,起始索引必须大于结束索引,即分片从右往左提取元素。例如:str3 = str2[7:0:-1] #str3为'gfedcb'str3 = str2[-1:-8:-1] #str3为'gfedcba'str3 = str2[::-1] #str3为'gfedcba'相加1.3使用加法运算符可对序列进行连接操作。例如:str4 = 'Hello,' + 'World' #字符串连接,str4为'Hello,World'list1 = [1,2,3] + [4,5,6] #列表连接,list1为[1, 2, 3, 4, 5, 6]相乘1.4使用数字n乘以一个序列会生成新的序列,在新的序列中,原来的序列将重复n次。例如:str5 = 'hello' * 3 #str5为'hellohellohello'长度、最小值和最大值1.5序列常用的内置函数有len()、min()和max(),其参数都为序列名。其中,len()函数返回序列中元素的个数(即序列长度),min()函数和max()函数则分别返回序列中最小和最大的元素。【例4-1】 输入一个字符串,输出字符串中的最大字符和最小字符,并将字符串输出为如下格式(输出的“ ”的个数会随着字符串的长度而变化),如图4-1所示。图4-1 输出的文字格式【问题分析】 本例题中,输出连续相同的字符“ ”,可使用序列的乘法运算实现,它的个数等于输入字符串的长度,可使用len()函数获取。然后使用max()和min()函数获取字符串中的最大字符和最小字符并输出。长度、最小值和最大值1.5【参考代码】strs = input('请输入一个字符串:') #输入字符串并赋给strsstr_len = len(strs) #获取strs长度并赋给str_lenstr_max = max(strs) #获取strs中最大字符并赋给str_maxstr_min = min(strs) #获取strs中最小字符并赋给str_minprint('该字符串中最大字符为:', str_max) #输出最大字符print('该字符串中最小字符为:', str_min) #输出最小字符print('+ ' + '-' * str_len + ' +') #输出“+ ”、str_len个“-”和“ +”print('| ' + strs + ' |') #输出“| ”、字符串和“ |”print('+ ' + '-' * str_len + ' +') #输出“+ ”、str_len个“-”和“ +”长度、最小值和最大值1.5【运行结果】 程序运行结果如图4-2所示。图4-2 例4-1程序运行结果查找和计数1.6序列提供index()方法用于返回指定元素在序列中首次出现的位置,如果该元素不在序列中则抛出异常,其语法格式如下。sequence.index(obj)如果需要知道指定元素在序列中出现的次数,可以使用count()方法进行计数并返回,其语法格式如下。其中,sequence表示序列,obj表示要查找的对象。sequence.count(obj)【例4-2】 查找输入的人物是否在《三国演义》片段中,如果在,则统计出现的次数。【问题分析】 首先使用“in”运算符判断输入的人物是否在《三国演义》片段中,如果在,则使用index()方法获取首次出现的位置,然后使用count()方法统计出现的次数。查找和计数1.6【参考代码】#创建字符串excerpts并赋值excerpts = '''次日,于桃园中,备下乌牛白马祭礼等项,三人焚香再拜而说誓曰:“念刘备、关羽、张飞,虽然异姓,既结为兄弟,则同心协力,救困扶危;上报国家,下安黎庶。不求同年同月同日生,只愿同年同月同日死。皇天后土,实鉴此心,背义忘恩,天人共戮!”誓毕,拜玄德为兄,关羽次之,张飞为弟。祭罢天地,复宰牛设酒,聚乡中勇士,得三百余人,就桃园中痛饮一醉。来日收拾军器,但恨无马匹可乘。正思虑间,人报有两个客人,引一伙伴当,赶一群马,投庄上来。玄德曰:“此天佑我也!”三人出庄迎接。原来二客乃中山大商:一名张世平,一名苏双,每年往北贩马,近因寇发而回。玄德请二人到庄,置酒管待,诉说欲讨贼安民之意。二客大喜,愿将良马五十匹相送;又赠金银五百两,镔铁一千斤,以资器用。'''查找和计数1.6【参考代码】(续)name = input('请输入人物姓名:') #输入人物姓名并赋给nameif name in excerpts: #如果name在此片段中#使用index()方法获取name首次出现的位置indexindex = excerpts.index(name)print(name, '首次出现的位置索引为:', index) #输出index#使用count()方法获取name出现的次数并输出print(name, '在此片段中出现', excerpts.count(name), '次')else:print(name, '没有出现在此片段中') #输出name不在此片段中查找和计数1.6【运行结果】 程序运行结果如图4-3所示。图4-3 例4-2程序运行结果PART 02百变字符串字符串格式化2.1Python提供了“%”符号进行字符串格式化,其语法格式如下。1. “%”符号其中,[]中的项为可选项,也可以表示为如下形式。'%[标志][0][输出最小宽度][.精度]格式字符' %变量'%[±][0][m][.n]格式字符' %变量(1)标志:标志字符为“+”或“ ”,指定输出数据的对齐方式。(2)输出最小宽度:用十进制整数m表示输出的最小位数。(3)精度:精度格式符以“.”开头,后跟十进制整数n。(4)格式字符:用来表示输出数据的类型,各种格式字符及其功能说明如表4-3所示。字符串格式化2.11. “%”符号表4-3 格式字符字符串格式化2.11. “%”符号【例4-3】 使用“%”符号格式化。【参考代码】a = 15 #定义变量a并赋值b = 12345678.1234567 #定义变量b并赋值s = 'I love Python!' #定义字符串s并赋值print('a = %05d' % a) #使用m控制输出位数,空位补0print('b = %8.3f' % b) #使用m.n控制输出的长度和小数点位数print('%17s' % s) #使用m控制输出字符串长度print('%-17.6s' % s) #使用-m.n左对齐、控制字符串长度和字符位数字符串格式化2.11. “%”符号【运行结果】程序运行结果如图4-4所示。图4-4 例4-3程序运行结果【程序说明】 输出变量a时,“%05d”表示输出宽度为5并用“0”来补空位。输出变量b时,“%8.3f”表示输出宽度为8,精度为3,由于实际长度超过8位,故应按实际位数输出,小数位数超过3位部分被截去。输出字符串s时,“%17s”表示输出字符串宽度为17,如果字符串本身长度不足17,则用空格左补齐,可以看到“I love Python!”前存在3个空格。“% 17.6s”表示输出宽度虽为17,但这里指定了精度“.6”,也就是说指定了输出字符的个数为6,并且用“ ”指定了左对齐,所以输出6个字符“I love”,后面还有11个空格。字符串格式化2.1使用format()方法也可以格式化字符串,其基本语法格式如下。2. format()方法模板字符串是由一系列槽(用大括号表示)组成,用于控制字符串中嵌入值出现的位置,其基本思想是,将format()方法中逗号分隔的参数按照序号替换到模板字符串的槽中(序号从0开始)。例如:模板字符串.format(逗号分隔的参数)#s为'你好,张三,你这个月的工资是8500元!'s = '你好,{1},你这个月的工资是{0}元!'.format(8500, '张三')如果大括号中没有序号,则按照出现顺序替换,例如:#s为'你好,8500,你这个月的工资是张三元!'s = '你好,{},你这个月的工资是{}元!'.format(8500, '张三')字符串格式化2.1format()方法中模板字符串的槽除了包括参数序号外,还可以包括格式控制信息,此时槽的内部格式如下。2. format()方法{参数序号:格式控制标记}其中格式控制标记用于控制参数显示时的格式,它包括“填充”“对齐”“宽度”“,”“.精度”“格式字符”6个可选字段,这些字段可以组合使用。具体的格式控制标记及其说明如表4-4所示。字符串格式化2.12. format()方法表4-4 格式控制标记字符串格式化2.12. format()方法【例4-4】 模拟输出简单的非刷新文本进度条。要求按照任务执行百分比将整个任务划分为100个单位,每执行10%输出一次进度条,每行输出包含进度百分比、代表已完成部分(**)和未完成部分(..)的两种字符,以及一个跟随完成进度前进的小箭头,风格如下:%10 [**->..................]【问题分析】 本例题的关键是输出字符的格式,可使用format()方法进行格式化。采用for循环和print()函数构成程序的主体部分,使用格式字符“%”输出百分比,为了使输出整齐,可使用{:^4.0%}格式化百分比部分。由于程序执行速度太快,不便于观察,可使用time.sleep(t)函数将当前程序暂停t秒,其中,time是Python标准时间库。字符串格式化2.12. format()方法【参考代码】import time #导入time模块scale = 10 #变量scale表示输出进度条的精度print('-----------执行开始-----------') #输出执行开始提示for i in range(scale + 1): #循环变量从0到scaledone = '**' * i #用“*”表示已完成的部分undone = '..' * (scale - i) #用“.”表示未完成的部分percent = i / scale #计算完成百分比#格式化输出print('{:>4.0%}[{}->{}]'.format(percent, done, undone))time.sleep(0.1) #暂停0.1秒print('-----------执行结束-----------') #输出执行结束提示字符串格式化2.12. format()方法【运行结果】 程序运行结果如图4-5所示。图4-5 例4-4程序运行结果字符串的常用操作2.2除了使用index()方法在字符串中查找指定元素,还可使用find()方法在一个较长的字符串中查找子串。如果找到子串,返回子串所在位置的最左端索引,否则返回 1,其语法格式如下。str.find(sub[,start[,end]])1. 查找字符串其中,str表示被查找字符串;sub表示查找的子串;start表示开始索引,缺省时为0;end表示结束索引,缺省时为字符串的长度。【例4-5】 使用find()方法实现例4-2,查找输入的人物是否在《三国演义》片段中。字符串的常用操作2.21. 查找字符串【参考代码】#创建字符串excerpts并赋值excerpts = '''次日,于桃园中,备下乌牛白马祭礼等项,三人焚香再拜而说誓曰:“念刘备、关羽、张飞,虽然异姓,既结为兄弟,则同心协力,救困扶危;上报国家,下安黎庶。不求同年同月同日生,只愿同年同月同日死。皇天后土,实鉴此心,背义忘恩,天人共戮!”誓毕,拜玄德为兄,关羽次之,张飞为弟。祭罢天地,复宰牛设酒,聚乡中勇士,得三百余人,就桃园中痛饮一醉。来日收拾军器,但恨无马匹可乘。正思虑间,人报有两个客人,引一伙伴当,赶一群马,投庄上来。玄德曰:“此天佑我也!”三人出庄迎接。原来二客乃中山大商:一名张世平,一名苏双,每年往北贩马,近因寇发而回。玄德请二人到庄,置酒管待,诉说欲讨贼安民之意。二客大喜,愿将良马五十匹相送;又赠金银五百两,镔铁一千斤,以资器用。'''字符串的常用操作2.21. 查找字符串【参考代码】(续)name = input('请输入人物姓名:') #输入人物姓名并赋给nameindex = excerpts.find(name)#使用find()方法在excerpts中查找nameif index > -1: #如果返回值大于-1#输出indexprint('{}首次出现的位置索引为:{}'.format(name, index))#使用count()方法获取name出现的次数并输出print('{}在此片段中出现{}次'.format(name, excerpts.count(name)))else:print('{}没有出现在此片段中'.format(name)) #输出不在此片段中字符串的常用操作2.21. 查找字符串【运行结果】 程序运行结果如图4-6所示。图4-6 例4-5程序运行结果字符串的常用操作2.2split()方法以指定字符为分隔符,从字符串左端开始将字符串分隔成多个子串,并返回分割结果的列表,其语法格式如下。str.split([delimiter, num])2. 分割字符串其中,str表示被分割的字符串;delimiter表示分隔符,可以是空格、换行(\n)、制表符(\t)等,缺省时为空格;num表示分割次数,缺省时全部分割。例如,使用split()方法将字符串“This is an example of cutting”进行分割,可以用下面代码实现。strs = 'This is an example of cutting' #创建字符串'''以空格为分隔符将字符串全部分割结果为['This', 'is', 'an', 'example', 'of', 'cutting']'''strs.split()'''以空格为分隔符将字符串分割3次结果为['This', 'is', 'an', 'example of cutting']'''strs.split(' ', 3)字符串的常用操作2.2join()方法用于将序列中的元素以指定的字符连接,生成一个新的字符串,其语法格式如下。str.join(sequence)3.连接字符串其中,str表示连接符,可以为空;sequence表示要连接的序列。例如,使用join()方法将字符串“Python!”中的字符用“ ”连接,可以用下面代码实现。#用“ ”连接字符,输出结果为“P-y-t-h-o-n-!”print('-'.join('Python!'))字符串的常用操作2.23.连接字符串【例4-6】 将字符串“Rain falls on field and tree.”中的多余空格删除,即如果有连续空格只保留一个。【问题分析】 可使用split()方法以空格为分隔符将字符串分隔成多个子串,然后使用join()方法通过空格将多个子串进行连接。【参考代码】strs = 'Rain falls on field and tree.‘ #创建字符串strsprint(strs) #输出strssplit_strs = strs.split() #以空格为分隔符,将strs全部分割print(split_strs) #输出分割后结果join_strs =' '.join(split_strs) #用空格连接分割后的子串print(join_strs) #输出连接后的字符串字符串的常用操作2.23.连接字符串【运行结果】 程序运行结果如图4-7所示。图4-7 例4-6程序运行结果字符串的常用操作2.2replace()方法用于将字符串中的旧字符串替换成新字符串,其语法格式如下。str.replace(old,new[,max])4.替换字符串其中,str表示字符串;old表示将被替换的旧字符串;new表示新字符串,用于替换old;max是可选参数,表示替换的最大次数,缺省时替换所有。例如,使用replace()方法将字符串“Monday Tuesday Wednesday”中的“day”替换为“DAY”,可以用下面代码实现。strs = 'Monday Tuesday Wednesday'#将strs中的day替换为DAY,输出结果为“MonDAY TuesDAY WednesDAY”print(strs.replace('day', 'DAY'))#将strs中的day替换为DAY,只替换两次,输出结果为“MonDAY TuesDAY Wednesday”print(strs.replace('day', 'DAY', 2))字符串的常用操作2.2strip()方法用于移除字符串首尾连续的空白字符或指定字符,其语法格式如下。str.strip([chars])5.移除字符串的首尾字符其中,str表示字符串;chars表示移除的字符串首尾指定的字符,缺省时为空格。例如,使用strip()方法移除字符串“110This is an example0001”中的“0”和“1”,可以用下面代码实现。strs = '110This is an example0001' #创建字符串#移除strs两侧的1,输出结果为“0This is an example000”print(strs.strip('1'))#移除strs两侧的1和0,输出结果为“This is an example”print(strs.strip('10'))字符串的常用操作2.2lower()方法用于将字符串中所有大写字符转换为小写,而upper()方法则用于将字符串中所有小写字符转换为大写,其语法格式如下。str.lower()str.upper()6.转换字符串的大小写其中,str表示字符串。例如,使用lower()方法将字符串“This is an EXAMPLE”转换为小写,再使用upper()方法将其转换为大写,可以使用下面代码实现。strs = 'This is an EXAMPLE' #创建字符串#将strs中的大写字符转换为小写,输出结果为“this is an example”print(strs.lower())#将strs中的小写字符转换为大写,输出结果为“THIS IS AN EXAMPLE”print(strs.upper())字符串的常用操作2.2isalnum()方法用于检测字符串是否由字母和数字,或两种中的一种组成,如果是则返回True,否则返回False,其语法格式如下。str.isalnum()7.检测字符串其中,str表示要检测的字符串。例如,使用isalnum()方法判断字符串“2021example”是否由字母和数字组成,可以用下面代码实现。strs = '2021example' #创建字符串print(strs.isalnum()) #判断strs中是否只有字母和数字,输出结果为TruePART 03会魔法的列表列表的创建和访问3.1创建列表只需将逗号分隔的不同元素使用方括号括起来即可。例如:animal = ['elephant', 'monkey', 'snake', 'tiger'] #创建列表animalnumber = [1, 2, 3, 4, 5] #创建列表number与字符串一样,可以通过下标索引的方式来访问列表中的元素。列表的正索引也是从0开始的,同样也可以是负索引。例如,使用animal[0]访问上述列表animal中索引为0的元素,取值为“elephant”。列表的创建和访问3.1【例4-7】 创建书包列表,记录书包里的物品。【参考代码】#创建列表schoolbag并赋值schoolbag = ['语文书', '数学书', '练习册', '笔盒']schoolbag1 = schoolbag #将schoolbag赋给schoolbag1print(schoolbag, schoolbag1) #输出schoolbag和schoolbag1schoolbag[0] = '英语书' #将第一个元素的值修改为“英语书”print(schoolbag, schoolbag1) #输出schoolbag和schoolbag1 列表的创建和访问3.1【运行结果】 程序运行结果如图4-8所示。图4-8 例4-7程序运行结果【程序说明】 schoolbag由实际数据赋值产生,为列表对象。将schoolbag赋值给列表schoolbag1只会对schoolbag列表生成一个新引用,此时,schoolbag和schoolbag1指向同一对象,即内存中真实数据只有一份。因此,修改了schoolbag后,schoolbag1也随之改变。列表的遍历3.2使用while循环遍历列表,首先须获取列表的长度,将其作为while循环的判断条件。1.使用while循环遍历列表【例4-8】 使用while循环输出书包中的每项物品。【参考代码】#创建书包列表schoolbag并赋值schoolbag = ['语文书', '数学书', '英语书', '漫画书']length = len(schoolbag) #获取列表的长度赋给lengthi = 0 #循环变量i初值为0while i < length: #当i小于length时循环print(schoolbag[i]) #输出列表元素i += 1 #循环变量加1【问题分析】 使用len()函数获取列表的长度,作为while循环的次数。列表的遍历3.21.使用while循环遍历列表【运行结果】 程序运行结果如图4-9所示。图4-9 例4-8程序运行结果列表的遍历3.2使用for循环遍历列表,只需将要遍历的列表作为for循环表达式中的序列即可。2.使用for循环遍历列表【例4-9】 使用for循环输出书包中的每项物品。【参考代码】#创建书包列表schoolbag并赋值schoolbag = ['语文书', '数学书', '英语书', '漫画书']for item in schoolbag: #将列表作为for循环表达式中的序列print(item) #输出item【运行结果】 程序运行结果如图4-10所示。图4-10 例4-9程序运行结果列表的基本操作3.3列表可使用append()、extend()或insert()方法来添加元素。(1)append()方法:在列表末尾添加新的元素,其语法格式如下。list.append(obj)1.添加元素其中,list表示列表,obj表示添加到列表末尾的对象。例如:number = [0, 1, 2, 3] #创建列表number并赋值number.append(4) #使用append()方法给number末尾添加元素4print(number) #输出number,结果为[0, 1, 2, 3, 4](2)extend()方法:在列表末尾一次性添加另一个序列中的多个值(用新列表扩展原来的列表),其语法格式如下。list.extend(seq)其中,list表示列表,seq表示添加到列表末尾的序列。列表的基本操作3.31.添加元素【例4-10】 在书包中再放入练习册和笔盒。【问题分析】 创建书包列表schoolbag、练习册列表workbook和笔盒列表penbox,其中,workbook包含语文练习册和数学练习册,penbox包含铅笔、油笔和橡皮。使用extend()方法将workbook列表添加到schoolbag中,使用append()方法将penbox添加到schoolbag中。列表的基本操作3.31.添加元素【参考代码】#创建书包列表schoolbag并赋值schoolbag = ['语文书', '数学书', '英语书', '漫画书']print(schoolbag) #输出schoolbag#创建练习册列表workbook并赋值workbook = ['语文练习册', '数学练习册']penbox = [‘铅笔’, ‘油笔’, ‘橡皮’] #创建笔盒列表penbox并赋值#使用extend()方法将workbook添加到schoolbag中schoolbag.extend(workbook)print(schoolbag) #输出schoolbag#使用append()方法将penbox添加到schoolbag中schoolbag.append(penbox)print(schoolbag) #输出schoolbag列表的基本操作3.31.添加元素【运行结果】 程序运行结果如图4-11所示。图4-11 例4-10程序运行结果【程序说明】 使用extend()方法时,是将workbook看作一个序列,将这个序列和schoolbag序列合并,因此,添加元素后,schoolbag中包含了6个元素。使用append()方法时,是将penbox看作一个对象,整体打包添加到schoolbag列表中,因此,添加元素后schoolbag中包含了7个元素,其中第7个元素是一个列表。列表的基本操作3.32.删除元素number = [1, 2, 3, 4, 5] #创建列表number并赋值del number[2] #使用del命令删除number中索引为2的元素print(number) #输出number,结果为[1, 2, 4, 5](1)del命令:根据索引删除列表中的元素。例如:number = [1, 2, 3, 4, 5] #创建列表number并赋值del number[1:3] #使用del命令删除索引从1到3(不含)的元素print(number) #输出number,结果为[1, 4, 5]del命令还可以使用分片的方式删除列表中的元素。例如:列表的基本操作3.32.删除元素list.pop([index])(2)pop()方法:根据索引删除列表中的元素,并返回该元素的值,其语法格式如下。number = [1, 2, 3, 4, 5] #创建列表number并赋值number.pop() #使用pop()方法删除number中的元素,返回值为5print(number) #输出number,结果为[1, 2, 3, 4]number.pop(0) #使用pop()方法删除number中索引为0的元素,返回值为1print(number) #输出number,结果为[2, 3, 4]其中,list表示列表,index表示删除列表元素的索引值,为可选参数,缺省时为 1,删除列表中的最后一个元素。例如:列表的基本操作3.32.删除元素list.remove(obj)(3)remove()方法:删除列表中某个值的第一个匹配项,其语法格式如下。其中,list表示列表,obj表示列表中要删除的对象。【例4-11】 从书包中拿走英语书和漫画书。【问题分析】 使用pop()方法删除“英语书”,使用remove()方法删除“漫画书”。列表的基本操作3.32.删除元素【参考代码】#创建书包列表schoolbag并赋值schoolbag = ['语文书', '数学书', '英语书', '漫画书']print(schoolbag) #输出schoolbagschoolbag.pop(2) #使用pop()方法删除索引为2的元素“英语书”print(schoolbag) #输出schoolbagschoolbag.remove('漫画书') #使用remove()方法删除元素“漫画书”print(schoolbag) #输出schoolbag【运行结果】 程序运行结果如图4-12所示。图4-12 例4-11程序运行结果列表的基本操作3.33.分片赋值number = [1, 2, 3, 4] #创建列表number并赋值print(number) #输出number,结果为[1, 2, 3, 4]number[2:] = [5, 6, 7] #替换索引从2开始到最后的元素print(number) #输出number,结果为[1, 2, 5, 6, 7]分片赋值就是以分片的形式给列表赋值,可以一次为多个元素赋值。例如:number = [1,7] #创建列表number并赋值#在number中索引为1的位置插入列表[2,3,4,5,6]中的元素number[1:1] = [2,3,4,5,6]print(number) #输出number,结果为[1, 2, 3, 4, 5, 6, 7]分片赋值还可以在不替换任何原有元素的情况下插入新的元素。列表的基本操作3.33.分片赋值number = [1, 2, 3, 4, 5, 6, 7] #创建列表并赋值number[1:6] = [] #用空列表替换number中索引1到索引6(不含)的元素print(number) #输出number,结果为[1, 7]分片赋值也可以删除元素。列表的基本操作3.34.列表排序(1)reverse()方法:将列表中的元素反向存放,其语法格式如下。list.reverse()其中,list表示列表,该方法没有参数,没有返回值。例如:number = [1,2,3,4] #创建列表number并赋值number.reverse() #使用reverse()方法将number中的元素反向存放print(number) #输出number,结果为[4, 3, 2, 1](2)sort()方法:将列表中的元素进行排序(默认为升序排序),其语法格式如下。list.sort([key=None][,reverse=False])其中,list表示列表;key为可选参数,如果指定了该参数,会使用该参数的方法进行排序;reverse为可选参数,表示是否降序排序,缺省时为False。列表的基本操作3.34.列表排序【例4-12】 将数字从大到小排序,将英文单词从短到长排序。【问题分析】 降序排序须指定参数reverse为True,要以序列内元素的长度来排序,须使用参数key指定排序依据为len()函数。【参考代码】#创建数字列表number并赋值number = [5, 6, 9, 3, 12, 15, 18, 20, 35, 62]number.sort(reverse=True) #使用sort()方法对number降序排序print(number) #输出number#创建英文单词列表words并赋值words = ['chicken', 'fox', 'duck', 'dog', 'rabbit', 'sheep']words.sort(key=len) #使用sort()方法对words按长度升序排序print(words) #输出words列表的基本操作3.34.列表排序【运行结果】 程序运行结果如图4-13所示。图4-13 例4-12程序运行结果列表的基本操作3.34.列表排序(3)sorted()函数:与sort()方法不同,内置函数sorted()返回新列表,并不对原列表进行任何修改,其语法格式如下。sorted(iterable[,key=None][,reverse=False])其中,iterable表示可迭代对象,如列表;参数key和reverse的用法与sort()方法中的相同。例如:number = [1, 5, 2, 3, 4] #创建列表number并赋值#将number中的元素升序排序后赋给变量number_newnumber_new = sorted(number)print(number) #输出number,结果为[1, 5, 2, 3, 4]print(number_new) #输出number_new,结果为[1, 2, 3, 4, 5]PART 04被束缚了的元组元组的创建和访问4.1创建元组常用的方法是将逗号分隔的不同元素用圆括号括起来,也可省略圆括号,直接使用逗号分隔元素。例如:x = ('a', 'b', 1, 2, 3) #创建元组xprint(x) #输出x,结果为('a', 'b', 1, 2, 3)y = 'a', 'b', 'c', 'd' #创建元组y时省略了圆括号print(y) #输出y,结果为('a', 'b', 'c', 'd')如果要定义一个空元组,可以使用没有元素的圆括号来表示。例如:x = () #创建空元组xprint(x) #输出x,结果为()1.创建元组元组的创建和访问4.1与列表类似,可以使用下标索引来访问元组中的元素。例如:x = ('a', 1, 3.14) #创建元组xprint(x[0]) #输出索引为0的元素,结果为“a”print(x[1]) #输出索引为1的元素,结果为1print(x[-1]) #输出索引为-1的元素,结果为3.142.访问元组元组的合并和遍历4.2元组中的元素值是不允许修改的,但可以对元组进行连接组合。例如:x = (1, 2, 3) #创建元组xy = ('a', 'b') #创建元组yz = x + y #将x和y进行连接组合后赋给zprint(z) #输出z,结果为(1, 2, 3, 'a', 'b')1.合并元组元组的合并和遍历4.22.遍历元组【例4-13】 使用元组保存月份信息并输出。【参考代码】#创建元组monthsmonths = ('January', 'February', 'March', 'April', 'May','June', 'July', 'August', 'September', 'October','November', 'December')print('months索引为1的元素', months[1]) #输出months索引为1的元素print('months索引为7的元素', months[7]) #输出months索引为7的元素for month in months: #循环print(month, end=' ') #输出元素元组的合并和遍历4.22.遍历元组【例4-13】 使用元组保存月份信息并输出。图4-14 例4-13程序运行结果PART 05有身份的字典字典的创建5.1直接赋值创建字典的语法格式如下。变量名 = {键1: 值1, 键2: 值2, 键3: 值3,……}字典的元素放在大括号中,元素之间用逗号分隔,“键”与“值”之间用冒号分隔。例如,创建一个学生信息字典,包括学生学号、姓名和年龄3个元素,可以用下面代码实现。#创建字典stu_infostu_info = {'num': '20210101', 'name': '小蓝', 'age': 10}1.直接赋值创建字典字典是Python中常用的一种数据存储结构,它由“键-值”对组成,表示一种映射关系,每个“键-值”对称为一个元素。其中,“键”可以是Python中任意不可变数据类型,如数字、字符串、元组等,但不能是列表、集合、字典等可变数据类型;“值”可以是任意数据类型。字典的创建5.1使用内置函数dict()可通过其他字典、“(键,值)”对的序列或关键字参数来创建字典。例如,通过下面5种方式使用dict()函数可创建相同的字典。#直接赋值创建字典stu_info1 = {'num': '20210101', 'name': '小蓝', 'age': 10}#通过其他字典创建stu_info2 = dict(stu_info1)#通过“(键,值)”对的列表创建stu_info3 = dict([('num','20210101'),('name','小蓝'),('age',10)])#通过关键字参数创建stu_info4 = dict(num = '20210101', name = '小蓝', age = 10)#通过dict和zip结合创建stu_info5 =dict(zip(['num','name','age'],['20210101','小蓝',10]))2.使用内置函数dict()创建字典字典的创建5.13.使用fromkeys()方法创建字典在Python中,当所有键对应同一个值时,可使用fromkeys()方法创建字典,其语法格式如下。dict.fromkeys(seq[,value])其中,seq为字典的“键”的列表;value为键对应的同一值,缺省时默认为None。例如:#创建字典,“值”默认为Nonestu_age1 = dict.fromkeys(['小蓝', '小舞'])#输出stu_age1,结果为{'小蓝': None, '小舞': None}print(stu_age1)#创建字典,“值”赋为10stu_age2 = dict.fromkeys(['小蓝', '小舞'], 10)#输出stu_age2,结果为{'小蓝': 10, '小舞': 10}print(stu_age2)字典的访问5.21.根据键访问值字典中的“键”可作为下标访问对应的“值”,如果字典中不存在这个“键”则会抛出异常,其语法格式如下。dict[key]其中,dict表示字典名,key表示要查找的键。例如:#创建字典stu_info = {'num': '20210101', 'name': '小蓝', 'age': 10}stu_info['num'] #根据num获取学号,结果为“20210101”stu_info['name'] #根据name获取姓名,结果为“小蓝”字典的访问5.22.使用get()方法访问值在访问字典时,若不确定字典中是否有某个键,可通过get()方法获取,若该键存在,则返回其对应的值,若不存在,则返回默认值,其语法格式如下。dict.get(key[,default = None])其中,dict表示字典名;key表示要查找的键;default表示默认值,如果指定键的值不存在,返回该默认值,当default缺省时,返回None。例如,使用get()方法访问前面定义的stu_info字典,可以用下面代码实现。stu_info.get('name') #使用get()方法获取学生姓名,结果为“小蓝”stu_info.get('sex') #使用get()方法获取学生性别,返回值为Nonestu_info.get('sex', '女') #设置返回默认值为“女”,返回值为“女”字典的访问5.22.使用get()方法访问值【例4-14】 创建中英文字典,根据输入的中文词组输出对应的英文单词。【参考代码】chinese = ['卷心菜', '午餐', '机器人', '天空', '花'] #创建中文词组列表chineseenglish = ['cabbage', 'lunch', 'robot', 'sky', 'flower'] #创建英文单词列表englishdictionary = dict(zip(chinese, english)) #使用dict()和zip()方法生成字典word = input('请输入中文词组:') #输入中文词组,并赋给wordprint(dictionary.get(word)) #使用get()方法获取word的值并输出【问题分析】 创建两个列表分别保存中文词组(键)和英文单词(值),要求两个列表一一对应;然后通过dict()和zip()函数创建字典;最后根据输入的中文词组,使用get()方法获取对应的值并输出。字典的访问5.22.使用get()方法访问值【运行结果】 程序运行结果如图4-15所示。图4-15 例4-14程序运行结果字典的基本操作5.31.修改和添加元素当以指定“键”为下标给字典元素赋值时,有下面两种含义。(1)若该“键”在字典中存在,则表示修改该“键”对应的值。(2)若该“键”不存在,则表示添加一个新的“键-值”对,即添加一个新元素到字典中。例如:#创建字典stu_info = {'num': '20210101', 'name': '小蓝', 'age': 10}stu_info['age'] = 11 #修改age的值print(stu_info['age']) #输出修改后的age值,结果为11stu_info['sex'] = '女' #添加学生性别#输出添加后的字典,结果为{'num': '20210101', 'name': '小蓝', 'age': 11, 'sex': '女'}print(stu_info)字典的基本操作5.32.删除元素(1)del命令:根据“键”删除字典中的元素,例如:#创建字典stu_info={'num': '20210101', 'name': '小蓝','age': 10}del stu_info['age'] #删除age“键-值”对#输出删除后的字典,结果为{'num': '20210101', 'name': '小蓝'}print(stu_info)字典的基本操作5.32.删除元素(2)clear()方法:删除字典中的所有元素,其语法格式如下。dict.clear()其中,dict表示字典名。该方法不包含任何参数,也没有返回值。例如:#创建字典stu_info = {'num': '20210101', 'name': '小蓝', 'age': 10}stu_info.clear() #清空字典print(stu_info) #输出清空后的字典,结果为{}字典的基本操作5.32.删除元素(3)pop()方法:删除指定的“键-值”对,并返回该“键”的值,其语法格式如下。dict.pop(key[,default])其中,dict表示字典名;key表示删除的键;default是默认值,当字典中没有要删除的key时,该方法返回指定的默认值。例如:#创建字典stu_info = {'num': '20210101', 'name': '小蓝', 'age': 10}stu_info.pop('age') #删除age“键-值”对,并返回age的值10stu_info.pop('age', 11) #无指定键,返回默认值11字典的基本操作5.32.删除元素(4)popitem()方法:随机删除并返回一个“键-值”对,其语法格式如下。dict.popitem()其中,dict表示字典名。该方法无参数,返回值为一个随机的“键-值”对。例如:#创建字典stu_info = {'num': '20210101', 'name': '小蓝', 'age': 10}stu_info.popitem() #随机删除并返回某“键-值”对,如('age', 10)#输出字典,结果为{'num': '20210101', 'name': '小蓝'}print(stu_info)字典的基本操作5.33.更新字典update()方法用于将新字典的“键-值”对一次性全部添加到当前字典中,如果两个字典中存在相同的“键”,则以新字典中的“值”更新当前字典,其语法格式如下。dict.update(dict1)其中,dict表示当前字典,dict1表示新字典。例如:#创建字典stu_infostu_info = {'num': '20210101', 'name': '小蓝', 'age': 10}#修改age的值,同时添加新元素stu_info.update({'age': 11, 'sex': '女'})#输出字典,结果为{'num': '20210101', 'name': '小蓝', 'age': 11, 'sex': '女'}print(stu_info)字典的基本操作5.33.更新字典【例4-15】 更新中英文字典。【参考代码】dictionary = {'卷心菜': 'cabbage','午餐': 'lunch','机器人': 'robot','天空': 'sky','花': 'flower'} #创建字典dictionary并赋值print(dictionary) #输出dictionarydictionary.pop('卷心菜') #删除“卷心菜”键-值对print(dictionary) #输出dictionary字典的基本操作5.33.更新字典【参考代码】(续)#添加新字典dictionary.update({'公园': 'park', '桥': 'bridge'})print(dictionary) #输出dictionarydictionary['午餐'] = ['lunch', 'nooning'] #修改“午餐”的值print(dictionary) #输出dictionary【运行结果】 程序运行结果如图4-16所示。图4-16 例4-15程序运行结果字典的基本操作5.34.复制字典复制字典可使用copy()方法,返回字典的浅复制,其语法格式如下。dict.copy()其中,dict表示需要复制的字典,该方法无参数,返回一个新字典。例如:#创建字典stu_infostu_info = {'num': '20210101', 'name': '小蓝', 'age': 10}stu_info1 = stu_info.copy() #复制stu_info,并赋给stu_info1#输出stu_info1,结果为{'num':'20210101','name':'小蓝', 'age': 10}print(stu_info1)字典的基本操作5.34.复制字典【例4-16】 使用直接赋值、浅复制和深复制3种方法复制中英文字典。【参考代码】import copy #导入copy模块#创建字典dictionary并赋值dictionary = {'卷心菜': 'cabbage', '午餐': ['lunch', 'nooning']}dictionary1 = dictionary #直接复制dictionary2 = dictionary.copy() #浅复制dictionary3 = copy.deepcopy(dictionary) #深复制#将dictionary中键为“卷心菜”的值改为“pamphrey”dictionary['卷心菜'] = 'pamphrey'字典的基本操作5.34.复制字典【参考代码】(续)#移除dictionary中键为“午餐”的值列表中的“nooning”dictionary['午餐'].remove('nooning')print('dictionary = ', dictionary) #输出dictionaryprint('dictionary1 = ', dictionary1) #输出dictionary1print('dictionary2 = ', dictionary2) #输出dictionary2print('dictionary3 = ', dictionary3) #输出dictionary3【运行结果】 程序运行结果如图4-17所示。图4-17 例4-16程序运行结果字典的基本操作5.34.复制字典【程序说明】 “dictionary1 = dictionary”是复制引用,dictionary和dictionary1都指向同一个对象,如图4-18所示。因此,修改dictionary中的任何一个值,dictionary1中也会随之改变。图4-18 赋值引用示意图字典的基本操作5.34.复制字典【程序说明】(续) “dictionary2 = dictionary.copy()”是浅复制,dictionary和dictionary2分别是独立的对象,但它们的子对象还是指向同一对象,如图4-19所示。因此,修改“dictionary['卷心菜'] = 'pamphrey'”不会改变dictionary2中的值,但修改dictionary中的子对象“dictionary['午餐'].remove('nooning')”时,dictionary2也会随之改变。图4-18 赋值引用示意图字典的基本操作5.34.复制字典【程序说明】(续) “dictionary3 = copy.deepcopy(dictionary)”是深复制,dictionary3完全复制了父对象及其子对象,它和dictionary是完全独立的,如图4-20所示。因此,修改dictionary中的任何一个值,dictionary3中的值都不会随之改变。图4-20 深复制示意图字典的遍历5.41.遍历字典中所有的“键-值”对使用item()方法可遍历字典中所有的“键-值”对,该方法以列表形式返回可遍历的“(键,值)”元组,其语法格式如下。dict.items()其中,dict表示字典。2.遍历字典中所有的键当不需要使用字典中的值时,可使用keys()方法只遍历字典中的键,该方法以列表形式返回字典中所有的键,其语法格式如下。dict.keys()其中,dict表示字典。字典的遍历5.43.遍历字典中所有的值当只需要使用字典中的值时,可使用values()方法,该方法以列表形式返回字典中所有的值,其语法格式如下。dict.values()其中,dict表示字典。【例4-17】 输出中英文字典中所有的中文词组及其对应的英文单词、中文词组和英文单词。字典的遍历5.4【参考代码】dictionary = {'卷心菜': 'cabbage','午餐': 'lunch','机器人': 'robot','天空': 'sky','花': 'flower'} #创建字典dictionary并赋值print('中英文字典中所有中文词组及其对应的英文单词')for item in dictionary.items(): #遍历“键-值”对print(item) #输出每个“键-值”对print('中英文字典中所有中文词组')for chinese in dictionary.keys(): #遍历字典所有的键print(chinese, end=' ') #输出每个键print('\n中英文字典中所有英文单词')for english in dictionary.values(): #遍历字典所有的值print(english, end=' ') #输出每个值字典的遍历5.4【运行结果】 程序运行结果如图4-21所示。图4-21 例4-17程序运行结果PART 06独一无二的集合集合的创建6.1a = {1, 2, 3, 4} #创建集合并赋值print(a) #输出集合a,结果为{1, 2, 3, 4}b = {2, 1, 3, 4, 1, 2} #创建集合并赋值print(b) #输出集合b,结果为{1, 2, 3, 4}由上述代码可以看出,由于集合元素是无序的,所以集合的输出结果与定义顺序可能不一致。创建集合只需将逗号分隔的不同元素使用大括号括起来即可。例如:集合的基本操作6.21.添加和删除元素与字典类似,Python也提供了多种函数和方法用于集合元素的添加和删除,具体操作的函数和方法如表4-5所示。表4-5 集合操作的函数和方法集合的基本操作6.21.添加和删除元素例如:s = {1, 2, 3} #创建集合并赋值s.add(4) #添加元素print(s) #输出集合,结果为{1, 2, 3, 4}s.update({4, 5, 6}) #更新当前集合,自动去除重复元素print(s) #输出集合,结果为{1, 2, 3, 4, 5, 6}s.discard(5) #删除元素,不存在则忽略该操作print(s) #输出集合,结果为{1, 2, 3, 4, 6}s.remove(3) #删除元素,不存在则抛出异常print(s) #输出集合,结果为{1, 2, 4, 6}s.pop() #删除并返回一个元素,返回值为1print(s) #输出集合,结果为{2, 4, 6}集合的基本操作6.22.集合运算内置函数len()、max()、min()、sorted()等也适用于集合,此外,Python中集合还支持数学意义上的交集、并集、差集、补集等运算,具体操作符如表4-6所示。表4-6 集合类型的操作符集合的基本操作6.22.集合运算例如:a = {1, 2, 3, 4, 5} #创建集合并赋值b = {1, 2, 6, 7, 8} #创建集合并赋值print(a & b) #输出交集,结果为{1, 2}print(a | b) #输出并集,结果为{1, 2, 3, 4, 5, 6, 7, 8}print(a - b) #输出差集,结果为{3, 4, 5}print(a ^ b) #输出补集,结果为{3, 4, 5, 6, 7, 8}x = {1, 2, 3} #创建集合并赋值y = {2, 3} #创建集合并赋值z = {1, 2, 4} #创建集合并赋值print(x >= y) #判断y是否为x的子集并输出,结果为Trueprint(x <= z) #判断x是否为z的子集并输出,结果为False感谢观看 展开更多...... 收起↑ 资源预览