版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本章目标理解可变类型和不可变类型的概念和区别掌握列表、元组、集合和字典的使用方法熟练运用切片、列表生成表达式、生成器和迭代器进行数据处理第5章序列、集合和字典01可变类型与不可变类型02创建列表和拼接列表03复制列表元素04列表元素的查找、插入和删除05列表元素的最大值、最小值、出现次数和列表长度06列表元素排序07元组的操作08集合的创建和插入元素09集合的运算10字典的创建和初始化11字典元素的修改、插入和删除12字典的浅拷贝和深拷贝13判断字典中是否存在键及拼接两个字典14字典的其他常用操作15切片和列表生成表达式16生成器17迭代器18应用案例——简易数据管理程序可变类型和不可变类型可变类型和不可变类型可变类型和不可变类型即可以对该类型对象中保存的元素值做修改,如列表、集合、字典都是可变类型。可变类型不可变类型即该类型对象所保存的元素值不允许修改,只能通过给对象整体赋值来修改对象所保存的数据。但此时实际上就是创建了一个新的不可变类型的对象、而不是修改原对象的值,如数值、字符串、元组都是不可变类型。可变类型和不可变类型例:可变类型对象和不可变类型对象示例1 n1,n2=1,1#定义两个整型变量n1和n2,都赋值为12 print('第2行n1和n2的内存地址分别为:',id(n1),id(n2))3 n2=3#将n2重新赋值为34 print('第4行n1和n2的内存地址分别为:',id(n1),id(n2))5 n1=3#将n1重新赋值为36 print('第6行n1和n2的内存地址分别为:',id(n1),id(n2))可变类型和不可变类型7 s1,s2='Python','Python'#定义两个字符串变量s1和s2,都赋值为'Python'8 print('第8行s1和s2的内存地址分别为:',id(s1),id(s2))9 s2='C++'#将s2重新赋值为'C++'10 print('第10行s1和s2的内存地址分别为:',id(s1),id(s2))11 s1='C++'#将s1重新赋值为'C++'12 print('第12行s1和s2的内存地址分别为:',id(s1),id(s2))可变类型和不可变类型13 t1,t2=(1,2,3),(1,2,3)#定义两个元组变量t1和t2,都赋值为(1,2,3)14 print('第14行t1和t2的内存地址分别为:',id(t1),id(t2))15 t2=(1,2,3)#t2被重新赋值为(1,2,3)16 print('第16行t1和t2的内存地址分别为:',id(t1),id(t2))可变类型和不可变类型17 ls1,ls2=[1,2,3],[1,2,3]#定义两个列表变量ls1和ls2,都赋值为[1,2,3]18 print('第18行ls1和ls2的内存地址分别为:',id(ls1),id(ls2))19 ls2[1]=5#将列表ls2中下标为1的元素值重新赋值为520 print('第20行ls1和ls2的内存地址分别为:',id(ls1),id(ls2))21 ls2=[1,2,3]#ls2被重新赋值为[1,2,3]22 print('第22行ls1和ls2的内存地址分别为:',id(ls1),id(ls2))可变类型和不可变类型提示:可变类型的对象和不可变类型的对象的区别在于是否可修改对象中的元素值。对于可变类型的对象,如果对可变类型对象中的元素做修改,则不会创建新对象;而如果直接对其赋值,则也会创建一个新的对象。对于取值相同的不可变类型的变量,均输出了相同的内存地址。然而,这与运行环境相关,在有的运行环境下,对于字符串和元组类型的变量,也可能会出现取值相同、但内存地址不同的情况。平常编写程序时,只需要关注可变类型变量的内存情况即可,以防止两个可变类型变量对应同一内存,造成对一个变量中的元素进行修改、而影响另一个变量中的元素的情况。创建列表和拼接列表创建列表和拼接列表创建列表列表,是用一对方括号[]括起来的多个元素的有序集合,各元素之间用逗号分隔。如果一个列表中不包含任何元素(即只有一对方括号),则该列表是一个空列表。例:使用一对方括号[]创建列表对象。创建列表1 ls1=[1,'one','一']#创建列表对象并将其赋给变量ls1,其包含3个元素2 ls2=[]#创建列表对象并将其赋给变量ls2,其不包含任何元素、因此是一个空列表3 print('ls1的值为:',ls1)4 print('ls2的值为:',ls2)创建列表例:使用list类创建列表对象。1 ls=list((1,'one','一'))#使用list类,根据元组创建列表对象,并赋给ls变量2 print('ls的值为:',ls)3 print('ls的第一个元素和最后一个元素的值分别为:',ls[0],ls[-1])4 print('ls的前两个元素的值为:',ls[0:-1])创建列表提示:ls=list((1,'one','一'))的外面一对圆括号对应list方法的形参列表,里面一对圆括号对应元组。也可以将该行代码分成两条语句:
t=(1,'one','一')#创建元组对象并赋给t ls=list(t)#根据元组t创建列表对象并赋给ls拼接列表通过拼接运算,可以将多个列表连接在一起,生成一个新的列表。拼接列表示例例1 ls1=[1,2,3]#创建列表对象并赋给变量ls12 ls2=['Python','C++']#创建列表对象并赋给变量ls23 ls3=ls1+ls2#通过拼接运算“+”将ls1和ls2连接生成一个新的列表对象并赋给ls34 print('ls1和ls2的值分别为:',ls1,ls2)5 print('ls3的值为:',ls3)提示:除了拼接运算“+”外,Python中的序列还支持重复运算“*”。复制列表元素复制列表元素概述Python中,通过两个变量间的赋值运算(如:a=b),实际上是将两个变量指向同一个对象,而不是将一个变量的值赋给另一个变量。两个变量指向同一个对象后,我们通过一个变量修改对象中元素的值,那么通过另一个变量访问对象时,访问到的对象中的元素值也是修改后的值。概述例:两个变量指向同一列表对象的示例。1 ls1=[1,2,3]#创建列表对象并赋给变量ls12 ls2=ls1#通过两个变量间的赋值运算,ls2和ls1指向同一个对象3 print('ls1和ls2的值分别为:',ls1,ls2)4 print('ls1和ls2的内存地址分别为:',id(ls1),id(ls2))5 ls1[1]=5#将ls1中下标为1的元素值修改为56 print('ls1和ls2的值分别为:',ls1,ls2)提示:通过赋值运算,ls1和ls2对应了同一个列表。浅拷贝例:通过指定索引范围的索引操作方式,实现列表的浅拷贝。1 ls1=[1,2,3]#创建列表对象并赋给变量ls12 ls2=ls1[:]#通过ls1[:],生成包含ls1所有元素的新列表对象,并赋给ls23 print('ls1和ls2的值分别为:',ls1,ls2)4 print('ls1和ls2的内存地址分别为:',id(ls1),id(ls2))5 ls1[1]=5#将ls1中索引值为1的元素值修改为56 print('ls1和ls2的值分别为:',ls1,ls2)浅拷贝例:列表浅拷贝在更深层元素操作上存在的问题示例。1 ls1=[1,[2,3]]#创建列表对象并赋给变量ls12 ls2=ls1[:]#通过ls1[:],获取ls1所有元素、生成新列表,并赋给ls23 print('ls1和ls2的值分别为:',ls1,ls2)4 print('ls1和ls2的内存地址分别为:',id(ls1),id(ls2))5 print('ls1[1]和ls2[1]的内存地址分别为:',id(ls1[1]),id(ls2[1]))6 ls1[1][0]=5#将ls1索引为1的列表元素(即ls[1])中索引值为0的元素值修改为57 print('ls1和ls2的值分别为:',ls1,ls2)深拷贝例:使用copy模块中的deepcopy函数,实现列表的深拷贝。1 importcopy#导入copy模块2 ls1=[1,[2,3]]#创建列表对象并赋给变量ls13 ls2=copy.deepcopy(ls1)#通过调用deepcopy函数复制ls1生成新对象,并赋给ls24 print('ls1和ls2的值分别为:',ls1,ls2)5 print('ls1和ls2的内存地址分别为:',id(ls1),id(ls2))6 print('ls1[1]和ls2[1]的内存地址分别为:',id(ls1[1]),id(ls2[1]))7 ls1[1][0]=5#将ls1索引值为1的列表元素(即ls[1])中索引值为0的元素值修改为58 print('ls1和ls2的值分别为:',ls1,ls2)列表元素的查找、插入和删除列表元素的查找、插入和删除查找列表元素ls.index(x)语法格式其中,ls是要进行元素查找操作的列表对象,x是要查找的元素值,返回值是ls中第一个值为x的元素的索引值。如果在ls中未找到值为x的元素,则会报错。通过list类提供的index方法,可以根据指定值查找第一个匹配的列表元素的位置。查找列表元素例1 ls=[1,3,5,3]#使用list方法根据元组创建列表对象,并赋给ls变量2 print('ls值为3的元素第一次出现的位置为:',ls.index(3))查找列表元素的示例。插入列表元素ls.insert(index,x)通过list类提供的insert方法,可以将一个元素插入到列表的指定位置,语法格式为:其作用是将元素x插入到ls列表索引值为index的位置上,列表中原索引值为index的元素及其之后的元素都会后移一个位置。如果要在列表的最后添加新元素,则还可以直接使用list类提供的append方法,语法格式为:ls.append(x)例1 ls=[1,2,3]#创建列表对象并赋给ls2 ls.insert(0,'Python')#在ls列表索引值为0的位置插入新元素'Python'3 print(ls)#输出ls4 ls.insert(2,True)#在ls列表索引值为2的位置插入新元素True5 print(ls)#输出ls6 ls.append([5,10])#在ls列表最后添加新元素[5,10]7 print(ls)#输出ls插入列表元素的示例。插入列表元素删除列表元素使用del语句,可以删除列表中指定索引值的元素。如果要删除列表中的连续多个元素,可以通过指定索引范围的索引操作访问列表中的多个元素,并将其赋为空列表。删除列表元素例1 ls=[0,1,2,3,4,5,6,7,8,9]#创建列表对象并赋给ls2 dells[8]#使用del,将ls中索引值为8的元素删除3 print(ls)#输出ls4 ls[1:6]=[]#将ls中索引值为1至5的元素删除5 print(ls)#输出ls删除列表元素的示例。列表元素的最大值、最小值、
出现次数和列表长度列表元素的最大值、最小值、
出现次数和列表长度获取列表中最大元素和最小元素使用max函数和min函数可以分别获取一个列表中最大元素和最小元素的值,语法格式如下:max(ls)min(ls)获取列表中最大元素和最小元素例1 ls=[23,56,12,37,28]#创建列表对象并赋给ls2 print('ls中的最大元素值为:',max(ls))#输出ls中最大元素的值获取列表最大元素值的示例。例1 ls=[23,56,12,37,28]#创建列表对象并赋给ls2 print('ls中的最小元素值为:',min(ls))#输出ls中最小元素的值获取列表最小元素值的示例。统计元素出现次数使用list类提供的count方法,可以统计某个值在列表中出现的次数。count方法的语法格式如下:ls.count(x)其作用是统计值x在列表ls中出现的次数,即列表ls中值为x的元素的数量。统计元素出现次数例:统计元素出现次数的示例。1 ls=[23,37,12,37,28]#创建列表对象并赋给ls2 print('ls中值为37的元素的数量为:',ls.count(37))3 print('ls中值为28的元素的数量为:',ls.count(28))4 print('ls中值为56的元素的数量为:',ls.count(56))计算列表长度使用len函数,可以获取一个列表中包含的元素数量(即列表长度)。len函数的语法格式如下:len(ls)计算列表长度例1 ls=[23,56,12,37,28]#创建列表对象并赋给ls2 print('ls的列表长度为:',len(ls))#输出ls中元素的数量计算列表长度示例。列表元素排序列表元素排序使用list类提供的sort方法,可以对列表中的元素按照指定规则进行排序。sort方法的语法格式如下:ls.sort(key=None,reverse=False)ls是待排序的列表;key接收一个函数,通过该函数获取用于排序时比较大小的数据,如果列表中数据本身可直接比较大小、则key可取默认参数值None;reverse指定是将列表中的元素按升序(False,默认值)、还是按降序(True)排列。列表元素排序例1 classStudent:#定义Student类2 def__init__(self,sno,name):#定义构造方法3 self.sno=sno#将self对象的sno属性赋为形参sno的值4 =name#将self对象的name属性赋为形参name的值5 def__str__(self):#定义内置方法__str__6 return'学号:'+self.sno+',姓名:'+列表元素排序的示例。列表中元素排序例列表元素排序的示例。列表中元素排序7 if__name__=='__main__':8 ls1=[23,56,12,37,28]#创建列表对象,并赋给变量ls19 ls1.sort()#将ls1中的元素按升序排序10 print('ls1升序排序后的结果:',ls1)11 ls1.sort(reverse=True)#将ls1中的元素按降序排序12 print('ls1降序排序后的结果:',ls1)例13 ls2=[Student('1810101','李晓明'),Student('1810100','马红'),Student('1810102','张刚')]#创建包含3个Student类对象的列表,并赋给变量ls214 ls2.sort(key=lambdastu:stu.sno)#按学号升序排序15 print('ls2按学号升序排序后的结果:')16 forstuinls2:#遍历ls2中的每名学生并输出其信息17 print(stu)#会使用stu自动执行Student类的__str__内置方法列表元素排序的示例。列表中元素排序例列表元素排序的示例。列表中元素排序18 ls2.sort(key=lambdastu:stu.sno,reverse=True)#按学号降序排序19 print('ls2按学号降序排序后的结果:')20 forstuinls2:#遍历ls2中的每名学生并输出其信息21 print(stu)#会使用stu自动执行Student类的__str__内置方法例列表中元素排序示例。列表中元素排序提示sort方法的关键字参数“key=lambdastu:stu.sno”表示将lambda函数传入stu对象的sno属性作为返回值,即ls2排序时是以sno属性值作为各元素(每个元素是一个Student类对象)比较大小的依据。也先可以定义一个函数,如:defGetStuSno(stu):#定义GetStuSno函数returnstu.sno#返回stu的sno属性提示然后将ls2.sort(key=lambdastu:stu.sno)ls2.sort(key=lambdastu:stu.sno,reverse=True)分别改为:ls2.sort(key=GetStuSno)#按学号升序排序ls2.sort(key=GetStuSno,reverse=True)#按学号降序排序元组的操作元组的操作创建元组元组就是用一对圆括号()括起来的多个元素的有序集合,各元素之间用逗号分隔。如果一个元组中不包含任何元素(即只有一对圆括号),则该元组就是一个空元组。创建元组例1 t1=(1,'one','一')#创建一个包含3个元素的元组对象,并将其赋给变量t12 t2=()#创建一个不包含任何元素的元组对象(即:空元组),并将其赋给变量t23 print('t1的值为:',t1)4 print('t2的值为:',t2)使用一对圆括号()创建元组的示例。创建元组例1 t=tuple([1,'one','一'])#使用tuple类,根据列表创建元组对象,并赋给变量t2 print('t的值为:',t)3 print('t的第一个元素和最后一个元素的值分别为:',t[0],t[-1])4 print('t的前两个元素的值为:',t[0:-1])使用tuple类创建元组的示例。创建元组在使用一对圆括号创建元组时,如果创建的元组中只包含单个元素,则需要在这唯一的一个元素后面添加逗号,否则圆括号会被系统认为是括号运算符、而不会被认为是在创建元组。创建元组例1 t1=(15)#不加逗号,则t1是一个整型变量2 t2=(15,)#加逗号,则t2是一个元组3 print('t1的类型为:',type(t1))4 print('t2的类型为:',type(t2))使用()创建具有单个元素的元组的示例。拼接元组虽然元组中的元素值不允许修改,但通过拼接运算可以两个元组连接、生成一个新元组。拼接元组例1 t1=(1,2,3)#创建元组对象,并赋给变量t12 t2=('Python','C++')#创建元组对象,并赋给变量t23 t3=t1+t2#通过拼接运算:+,将t1和t2连接生成一个新的列表对象,并赋给t34 print('t1和t2的值分别为:',t1,t2)5 print('t3的值为:',t3)拼接元组示例。提示:除了拼接运算“+”外,元组也支持重复运算“*”。获取元组中的最大、最小元素使用max函数和min函数可以分别获取一个元组中最大元素和最小元素的值,语法格式如下:max(t)min(t)获取元组中的最大、最小元素例1 t=(23,56,12,37,28)#创建元组对象,并赋给t2 print('t中的最大元素值为:',max(t))#输出t中最大元素的值获取元组中最大元素值的示例。例1 t=(23,56,12,37,28)#创建元组对象,并赋给t2 print('t中的最小元素值为:',min(t))#输出t中最小元素的值获取元组中最小元素值的示例。集合的创建和插入元素集合的创建和插入元素集合的创建集合的创建可以使用一对花括号{}或Python内置的set类创建集合,如果要创建空集合则只能使用set类。集合中各元素的取值必须唯一,即不同的元素必须具有不同的取值。如果创建集合或向集合中插入元素时,存在多个元素具有相同值的情况,则集合会自动过滤取值重复的元素、使得每一取值的元素在集合中只保留一份。例:集合元素唯一性的示例。集合的创建1 s=set([23,37,12,37,28])#创建集合对象,并赋给s2 print('s的值为:',s)#输出s提示:集合对象中的各元素没有顺序之分,集合对象会自动以方便高效进行元素检索的方式进行元素的存储。我们在查看集合对象的输出结果时,只需要关注集合对象中包含了哪些元素,而不需要关注这些元素是按照什么顺序显示的。插入集合元素集合中提供了两种插入元素的方法,分别是add和update。add方法的语法格式为:s.add(x)其作用是把x作为一个新的元素插入到集合s中,其中x必须是一个可哈希对象。update方法的语法格式为:s.update(x)其作用是遍历x中的每个元素,并将其插入到集合s中,其中x必须是一个可迭代对象。例:add方法和update方法使用示例。1 s1=set([1,2])#创建集合对象,并赋给变量s12 s2=set([1,2])#创建集合对象,并赋给变量s23 s1.add('Python')#使用add方法,向s1中插入元素:'Python'4 s2.update('Python')#使用update方法,遍历'Python'中的每个元素并插入到s2中5 print('s1的值为:',s1)#输出s16 print('s2的值为:',s2)#输出s2插入集合元素7 #s1.add([4,5])#取消前面的注释则会报错8 s2.update([4,5])#使用update方法,遍历[4,5]中的每个元素并插入到s2中9 s1.add(3)#使用add方法,向s1中插入元素310 #s2.update(3)#取消前面的注释则会报错11 print('s1的值为:',s1)#输出s112 print('s2的值为:',s2)#输出s2插入集合元素对于第7行代码,因为add方法要求插入到集合中的元素必须是可哈希的,而列表是不可哈希的、所以如果取消前面的注释则会报错。提示:插入集合元素对于第12行代码,因为update方法要求传入的参数必须是可迭代的,而整数是不可迭代的、所以如果取消前面的注释则会报错。提示:插入集合元素集合的运算集合的运算交集和并集集合中的intersection方法可以用于计算一个集合与另一个集合的交集,语法格式为: ersection(s2)其作用是计算s1和s2的交集并返回。intersection方法不会修改s1和s2本身的值。集合中的union方法可以用于计算一个集合与另一个集合的并集,语法格式为: s1.union(s2)其作用是计算s1和s2的并集并返回。union方法不会修改s1和s2本身的值。差集集合中的difference方法可以用于计算一个集合与另一个集合的差集,语法格式为:其作用是计算s1和s2的差集并返回,差集是指由包含在s1中但不包含在s2中的元素组成的集合。difference方法不会修改s1和s2本身的值。s1.difference(s2)对称差集集合中的symmetric_difference方法可以用于计算一个集合与另一个集合的对称差集,语法格式为:s1.symmetric_difference(s2)其作用是计算s1和s2的对称差集并返回,对称差集是指由只包含在s1中或只包含在s2中的元素组成的集合。symmetric_difference方法不会修改s1和s2本身的值。例:交集、并集、差集、对称差集的计算示例。1 s1=set([1,2,3])#创建集合对象,并赋给变量s12 s2=set([2,3,4])#创建集合对象,并赋给变量s23 s3=ersection(s2)#计算s1和s2的交集,并将返回集合赋给s34 s4=s1.union(s2)#计算s1和s2的并集,并将返回集合赋给s45 s5=s1.difference(s2)#计算s1和s2的差集,并将返回集合赋给s56 s6=s1.symmetric_difference(s2)#计算s1和s2的对称差集,并将返回集合赋给s6示例例:交集、并集、差集、对称差集的计算示例。7 print('s1和s2的值分别为:',s1,s2)8 print('s1和s2的交集为:',s3)9 print('s1和s2的并集为:',s4)10 print('s1和s2的差集为:',s5)11 print('s1和s2的对称差集为:',s6)差集和对称差集例:交集、并集、差集、对称差集的计算示例。差集和对称差集子集和父集使用集合提供的issubset方法,可以判断一个集合是否是另一个集合的子集,语法格式为:s1.issubset(s2)其作用是判断s1是否是s2的子集。如果s1是s2的子集,则返回True;否则,返回False。子集和父集使用集合提供的issuperset方法,可以判断一个集合是否是另一个集合的父集,语法格式为:s1.issuperset(s2)其作用是判断s1是否是s2的父集(即判断s2是否是s1的子集)。如果s1是s2的父集,则返回True;否则,返回False。例:子集和父集的判断示例。1 s1=set([1,2,3,4])#创建集合对象,并赋给变量s12 s2=set([2,3,4,5])#创建集合对象,并赋给变量s23 s3=set([1,3])#创建集合对象,并赋给变量s34 print('s3是s1的子集:',s3.issubset(s1))5 print('s1是s3的父集:',s1.issuperset(s3))6 print('s3是s2的子集:',s3.issubset(s2))7 print('s3是s2的父集:',s3.issuperset(s2))子集和父集例:子集和父集的判断示例。子集和父集字典的创建和初始化字典的创建和初始化创建字典与集合类似,字典(dictionary)也是由若干无序的元素组成。但与集合不同的是,字典是一种映射类型,字典中的每个元素都是键(key):值(value)的形式。字典中每个元素的键的取值必须唯一(即字典中不能包含具有相同键值的元素),且每个元素的键必须是一个可哈希数据;对于字典中每个元素的值,则没有任何取值上的限制。创建字典字典的主要应用之一是做数据的快速检索。实际使用字典时,将作为查询条件的数据项作为元素的键,将其他数据项作为元素的值。例如,在进行学生信息管理时,经常要根据学号进行学生信息的查询,此时就可以将学号作为键、而将其他信息作为值。可以使用一对花括号{}或Python内置的dict类创建字典,如果要创建空字典则可以使用{}或dict()。初始化字典元素fromkeys方法的语法格式为:dict是字典类;iterable是一个可迭代对象,用于指定新创建字典对象中每一元素的键;value用于指定了各元素的初始值,未传实参的情况下所有元素的值都被赋为None。dict.fromkeys(iterable,value=None)初始化字典元素例:dict类的类方法fromkeys的使用示例1 d1=dict.fromkeys(['sno','name','major'])2 d2=dict.fromkeys(['sno','name','major'],'Unknown')3 print('d1的值为:',d1)4 print('d2的值为:',d2)GAME初始化字典元素提示:fromkeys是一个类方法,可以通过dict类调用,也可以通过dict类的实例对象调用。当通过dict类的实例对象调用时,类方法fromkeys的第1个形参也只会接收该实例对象所属的dict类,在方法中不会对调用类方法时所使用的实例对象做任何操作。因此,如果使用一个dict类对象调用类方法fromkeys,即便该实例对象中原来已经有其他元素,但这些已有元素并不会作为新创建字典对象中的元素。例如,对于下面的代码:d1=dict(age=18)print('d1的值为:',d1)d2=d1.fromkeys(['sno','name','major’])print('d2的值为:',d2)初始化字典元素d1的值为:{'age':18}d2的值为:{'sno':None,'name':None,'major':None}程序执行完毕后,将在屏幕上输出:可以看到,虽然在调用fromkeys方法前d1对象中已经有了一个键为'age'的元素,但该元素在d2中并不存在。字典元素的修改、插入和删除字典元素的修改、插入和删除字典元素的修改和插入给指定键的元素赋值时,如果该键在字典中已存在,则会修改该键对应的元素的值;如果该键在字典中不存在,则会在字典中插入一个新元素。另外,也可以使用dict类提供的update方法向字典对象中一次修改或插入多个元素,其语法格式为:d.update(d2)#遍历字典对象d2中的每一个元素,对字典对象d做元素修改或插入操作或d.update(键1=值1,键2=值2,…,键N=值N)#用不定长的关键字参数,对字典对象d做元素修改或插入操作字典元素的修改和插入例:插入和修改字典元素的示例1 stu=dict(sno='1810101')#创建字典对象,并赋给变量stu2 print(stu)#输出stu的值3 stu['sno']='1810100'#将键为'sno'的元素的值修改为'1810100'4 print(stu)#输出stu的值5 stu['name']='李晓明'#插入一个键为'name'的元素,其值为'李晓明'6 print(stu)#输出stu的值字典元素的修改和插入7 stu.update({'name':'马红','age':19})#进行多个元素的修改和插入8 print(stu)#输出stu的值9 stu.update(name='张刚',major='计算机')#进行多个元素的修改和插入10 print(stu)#输出stu的值字典元素的删除字典元素的删除使用del语句或dict类提供的pop方法按指定的键删除对应元素。pop方法的语法格式为:d.pop(k[,default])其作用是从字典对象d中删除键为k的元素并返回该元素的值。如果d中不存在键为k的元素、但调用pop方法时为形参default传了实参,则将形参default的值作为返回值;如果d中不存在键为k的元素、且调用pop方法时没有为形参default传实参,则会报错。字典元素的删除例:删除字典元素的示例1 d=dict(sno='1810100',name='李晓明',age=19)2 print('第2行输出的字典d:',d)3 deld['age']4 name=d.pop('name')5 print('name的值为:',name)6 print('第6行输出的字典d:',d)7 major=d.pop('major','Notfound')8 print('major的值为:',major)9 #major=d.pop('major')#取消前面的注释会报错字典元素的删除初始化字典元素提示:如果将第9行代码前面的注释取消,则会因未找到键为'major'的元素,产生错误信息。字典的浅拷贝和深拷贝字典的浅拷贝和深拷贝浅拷贝字典不支持指定索引范围的索引操作,要实现字典的浅拷贝,则需要使用dict类提供的copy方法。copy方法的语法格式为:d.copy()其作用是对字典对象d进行浅拷贝,创建一个新的字典对象并返回。例:字典浅拷贝示例1 stu1={'name':'李晓明','age':19,'score':{'python':95,'math':92}}2 stu2=stu1#直接赋值,此时stu1和stu2指向同一个字典对象3 stu3=stu1.copy()#使用copy方法进行浅拷贝4 print('stu1、stu2和stu3的内存地址分别为:',id(stu1),id(stu2),id(stu3))浅拷贝例:字典浅拷贝示例5 stu1['name']='马红'#对字典对象中第1层的元素做修改6 print('stu1的值为:',stu1)7 print('stu2的值为:',stu2)8 print('stu3的值为:',stu3)浅拷贝例:字典浅拷贝示例9 print("stu1['score']和stu3['score']的内存地址分别为:", id(stu1['score']),id(stu3['score']))10 stu1['score']['python']=100#对字典对象stu1中第2层的元素做修改11 print('stu1的值为:',stu1)12 print('stu3的值为:',stu3)深拷贝使用copy模块的deepcopy方法可以实现深拷贝,deepcopy方法的语法格式为:copy.deepcopy(d)深拷贝不仅使原有字典对象和生成的字典对象对应不同的内存空间,而且使两个字典对象中的可变类型元素也对应不同的内存空间,从而使得两个字典对象在各层元素的取值上完全独立。其作用是对字典对象d进行深拷贝,创建一个新的字典对象并返回。深拷贝1 importcopy#导入copy模块2 stu1={'name':'李晓明','age':19,'score':{'python':95,'math':92}}3 stu2=copy.deepcopy(stu1)#使用copy.deepcopy方法进行深拷贝4 print("stu1和stu2的内存地址分别为:",id(stu1),id(stu2))5 print("stu1['score']和stu2['score']的内存地址分别为:", id(stu1['score']),id(stu2['score']))深拷贝6 stu1['score']['python']=100#对字典对象stu1中第2层的元素做修改7 print('stu1的值为:',stu1)8 print('stu2的值为:',stu2)判断字典中是否存在键
及拼接两个字典判断字典中是否存在键
及拼接两个字典判断字典中是否存在键我们可以使用两种方式判断字典中是否存在指定键的元素。一种方式是使用dict类提供的get方法,其语法格式为:d.get(key,default=None)其作用是从字典对象d中获取键为key的元素的值,并返回。如果在字典对象d中不存在键为key的元素,则返回default参数的值(默认为None)。另一种方式是使用成员运算符in。判断字典中是否存在键例:判断字典中是否存在指定键的元素的示例1 d=dict(sno='1810100',name='李晓明')#创建字典对象,并赋给变量d2 ifd.get('sno')!=None:#如果get方法返回的不是None3 print('字典d中存在键为sno的元素,且其值不为None')4 else:#否则5 print('字典d中不存在键为sno的元素,或键为sno的元素的值为None')6 if'name'ind:#如果字典d中有键为'name'的元素7 print('字典d中存在键为name的元素')8 else:9 print('字典d中不存在键为name的元素')10 ifd.get('age')!=None:#如果get方法返回的不是None11 print('字典d中存在键为age的元素')12 else:#否则13 print('字典d中不存在键为age的元素')拼接两个字典两种方法:第一种:
dMerge=dict(d1,**d2)第二种:
dMerge=d1.copy() dMerge.update(d2)其中,d1和d2是待拼接的两个字典,dMerge用于保存拼接后的字典。拼接两个字典例:字典拼接示例1 d1=dict(sno='1810100',name='李晓明')#创建字典对象,并赋给变量d12 d2=dict(age=19)#创建字典对象,并赋给变量d23 dMerge1=dict(d1,**d2)4 print('dMerge1的值为:',dMerge1)5 dMerge2=d1.copy()#使用copy方法对d1进行浅拷贝,生成新的字典对象并赋给dMerge26 dMerge2.update(d2)#根据d2中的元素对dMerge2进行修改和插入操作7 print('dMerge2的值为:',dMerge2)拼接两个字典提示:两种字典拼接方法实现的均是浅拷贝,即拼接后所创建的新的字典对象与原有的两个字典对象在第1层元素的取值上相互独立,但在第2层及更深层次元素的取值上彼此关联。如果要实现深拷贝,则需要对d1和d2进行深拷贝。例如,将方法1和方法2分别改写为:修改后的方法1:
dMerge=dict(copy.deepcopy(d1),**copy.deepcopy(d2))方法2:
dMerge=copy.deepcopy(d1) dMerge.update(copy.deepcopy(d2))字典的其他常用操作字典的其他常用操作计算字典中元素个数使用Python提供的内置函数len,可以计算字典中的元素个数。len函数的语法格式为:len(d)其中,d为要计算元素个数的字典对象。1 d=dict(sno='1810100',name='李晓明',age=19)#创建字典对象,并赋给变量d2 print('字典d中的元素个数为:',len(d))例清除字典中所有元素使用dict类提供的clear方法,可以一次将一个字典中的所有元素都清除。clear方法的语法格式为:d.clear()其中,d为要清除元素的字典对象。1 d=dict(sno='1810100',name='李晓明',age=19)#创建字典对象,并赋给变量d2 print('字典d中的元素个数为:',len(d))3 d.clear()#调用clear方法清除字典对象d中的所有元素4 print('字典d中的元素个数为:',len(d))例获取字典中键集合使用dict类提供的keys方法,可以获取一个字典对象所有元素的键。keys方法的语法格式为:d.keys()其作用是返回一个包含字典对象d中所有元素的键的可迭代对象。1 d=dict(sno='1810100',name='李晓明')2 print('d中的键为:',d.keys())例获取字典中值集合使用dict类提供的values方法,可以获取一个字典对象所有元素的值。values方法的语法格式为:d.values()其作用是返回一个包含字典对象d中所有元素的值的可迭代对象。1 d=dict(sno='1810100',name='李晓明')2 print('d中的值为:',d.values())例获取字典中元素数组使用dict类提供的items方法,可以返回一个可迭代对象,该可迭代对象以元组形式存储字典对象中每个元素的键和值。items语法格式为: d.items()其中,d是一个字典对象。如果字典对象中包含N个元素,即:d={键1:值1,键2:值2,……,键N:值N},则生成的可迭代对象中包含N个元组,分别是:(键1,值1)、(键2,值2)、……、(键N,值N)。1 d=dict(sno='1810100',name='李晓明')2 forkey,valueind.items():3 print(key,value)例获取字典中元素数组提示:如果直接在字典上做遍历,则每次只能获取到一个元素的键,然后再通过键去获取该元素的值。切片和列表生成表达式切片和列表生成表达式切片从一个序列对象中取部分元素、形成一个新的序列对象,是一个非常常用的操作,这个操作被称作切片(slice)。01切片操作除了可以取指定范围中的多个连续元素,还可以以固定步长取指定范围中的多个不连续元素。02切片1 ls1=list(range(0,20))#创建包含20个元素(0至19)的列表对象,并赋给ls2 print('ls1:',ls1)#输出ls13 ls2=ls1[3:10:2]#从ls1索引值3至9的元素中、以步长2取元素生成一个新列表ls24 print('ls2:',ls2)#输出ls25 ls3=ls1[-10::3]#从ls1倒数第10个元素到最后一个元素中、以步长3取元素生成一个新列表ls36 print('ls3:',ls3)#输出ls37 ls4=ls1[-1:-11:-3]#从ls1最后一个元素到倒数第10个元素中、以步长-3取元素生成一个新列表ls48 print('ls4:',ls4)#输出ls4列表生成表达式当我们创建一个列表对象时,除了前面介绍的方法,还可以用列表生成表达式。在列表生成表达式中,可以使用for、if以及一些运算生成列表中的元素。列表生成表达式例:1 ls=[x*xforxinrange(10)]#创建包含10个元素的列表对象,并赋给ls2 print(ls)#输出ls即通过for使得x在0至9范围内依次取值,对于每一个x,将x*x的计算结果作为列表对象中的元素。列表生成表达式例:1 ls=[x*xforxinrange(10)ifx%2!=0]2 print(ls)#输出ls还可以在for后面加上if判断。01列表生成表达式例:1 snolist=['1810101','1810102','1810103']2 namelist=['李晓明','马红','张刚']3 ls=['学号:'+sno+',姓名:'+nameforsnoinsnolistfornameinnamelist]4 forstuinls:5 print(stu)另外,列表生成表达式中也支持多层循环的形式,这里只给出两层循环的例子。02列表生成表达式生成器生成器生成器当一个列表中包含大量元素时,如果一次生成所有元素并保存在列表中,将占用大量的内存空间(有的情况下可用内存甚至无法满足存储需求)。01对于这个问题,我们可以使用生成器(generator),通过“按需生成”来解决,即生成器会根据访问需求、计算每个元素的值并返回,而不需要把所有要访问的元素都提前生成好。02将列表生成表达式中的一对方括号改为一对圆括号,即可得到生成器。生成器对象是可迭代的,可以使用for循环遍历生成器对象,从而使生成器对象可以根据访问需求依次返回每一个元素。03例:1 g=(x*xforxinrange(10))#创建一个生成器对象,并赋给g2 print('g的类型为:',type(g))3 foriing:#使用for循环遍历生成器对象g4 print(i,end='')生成器如果生成元素的方法比较复杂,不适合用for循环方式实现,我们还可以借助yield关键字、利用函数实现生成器。01例:使用yield关键字,实现faclist函数,依次生成1的阶乘、2的阶乘、…、n的阶乘。02例:1 deffaclist(n):#定义函数faclist2 result=13 forjinrange(2,n+1):#j在2至n范围内依次取值4 yieldresult#暂停执行并返回result,下次执行时继续从此处开始执行5 result*=j#将j乘到result上6 foriinfaclist(10):#遍历faclist并输出每个元素的值7 print(i,end='')迭代器迭代器概述可直接使用for循环遍历的对象,统称为可迭代对象(Iterable)。01迭代器(Iterator)是指可以通过next函数不断获取下一个元素值的可迭代对象。迭代器必然是可迭代对象,但并不是所有的可迭代对象都是迭代器。02可以使用isinstance方法判断一个对象是否是可迭代对象或迭代器。03概述1 fromcollections.abcimportIterable,Iterator#导入Iterable和Iterator类2 ls=[1,2,3,4,5]#创建一个列表对象3 g=(xforxinrange(1,6))#创建一个生成器4 print('ls是可迭代对象:',isinstance(ls,Iterable))5 print('g是可迭代对象:',isinstance(g,Iterable))6 print('ls是迭代器:',isinstance(ls,Iterator))7 print('g是迭代器:',isinstance(g,Iterator))iter函数例:1 fromcollections.abcimportIterator#导入Iterator类2 ls=[1,2,3,4,5]#创建一个列表对象3 it=iter(ls)#利用iter函数获取ls的迭代器4 print('it是迭代器:',isinstance(it,Iterator))对于可迭代对象,可以通过iter函数得到迭代器。01next函数例:1 g=(xforxinrange(1,3))#创建一个生成器2 print('第1个元素:',next(g))3 print('第2个元素:',next(g))4 #print('第3个元素:',next(g))#取消前面的注释,则会引发StopIteration异常对于迭代器,则可以使用next函数不断获取下一个元素。当所有元素都获取完毕后,再调用next函数,就会引发StopIteration异常。01next函数取消第4行代码前面的注释,则会产生报错信息:自定义迭代器如果我们要自己定义一个迭代器类,则需要在类中实现__next__和__iter__这两个方法。01例:021 fromcollections.abcimportIterator2 classFaclist:#定义Faclist类3 def__init__(self):#定义构造方法4 self.n=15 self.fac=1自定义迭代器6 def__next__(self):#定义__next__方法7 self.fac*=self.n8 self.n+=18 returnself.fac9 def__iter__(self):#定义__iter__方法10 returnself11 if__name__=='__main__':12 facs=Faclist()#创建Faclist类的实例对象facs13 print('facs是迭代器对象:',isinstance(facs,Iterator))14 foriinrange(1,6):#i在1至5范围依次取值15 print('第%d个元素:'%i,next(facs))应用案例
——简易数据管理程序应用案例 ——简易数据管理程序新增查询结果数据的排序操作代码实现dataset_manage.py:定义了DatasetManage类,用于进行数据集的切换操作;新增show_data_list和sort_data_list两个方法,并修改show_query_result方法的实现,以支持所查询数据的排序操作data_manage.py:定义了用于数据管理操作的DataManage类(未作修改)item_manage.py:定义了用于数据项管理操作的ItemManage类(未作修改)user.py:定义了用于用户操作的User类(未作修改)ex5_49.py:程序执行的入口(未作修改)新增查询结果数据的排序操作本章目标掌握字符串创建、字符串比较等常用字符串操作方法掌握占位符和format方法的使用理解正则表达式的基础语法并掌握re模块的使用方法利用正则表达式解析文本内容、从文本中获取信息本章内容01创建字符串和不同引号的区别02字符串比较03字符串切割04字符串检索和替换05去除字符串空格和大小写转换06字符串的其他常用操作07占位符和format方法08正则表达式的基础语法09re模块使用-compile和match10re模块使用-search11re模块使用-匹配对象12re模块使用-findall和finditer13re模块使用-split、sub和subn14爬虫程序示例15应用案例——简易数据管理程序创建字符串和引号的区别创建字符串和引号的区别创建字符串例:创建字符串示例。1 str1='HelloWorld!'#使用一对单引号创建字符串,并赋给变量str12 str2="你好,世界!"#使用一对双引号创建字符串,并赋给变量str23 str3='''我喜欢学习Python语言!'''#使用一对三引号创建字符串,并赋给变量str34 print(str1)#输出str15 print(str2)#输出str26 print(str3)#输出str3创建字符串时,可以使用单引号(')、双引号(")或三引号(即三个连续的单引号'''或双引号""")。单引号、双引号、三引号之间的区别单引号和双引号中的字符串要求写在一行中,二者在使用方法上并没有什么区别。01只是使用单引号创建字符串时,如果字符串中包含单引号字符,则必须在单引号字符前加上转义符“\”;而使用双引号创建字符串时,如果字符串中包含双引号字符,则必须在双引号字符前加上转义符“\”。02因此,我们可以根据实际情况决定创建字符串时使用哪种引号,从而在编写代码时可以减少转义符的使用、增强程序的可读性。03单引号、双引号、三引号之间的区别例:单引号和双引号使用示例。1 str1='It\'sabook.'#使用\'说明其是字符串中的一个单引号字符,不加\则会报错2 str2="It'sabook."#使用一对双引号创建字符串,此时字符串中的单引号不需要转义符3 str3="Hesaid:\"Itisyourbook.\""#使用\"说明其是字符串中的双引号字符4 str4='Hesaid:"Itisyourbook."'#使用一对单引号创建字符串,省掉了转义符5 print(str1)#输出str16 print(str2)#输出str27 print(str3)#输出str38 print(str4)#输出str4单引号、双引号、三引号之间的区别单引号和双引号中的字符串如果分多行写,必须在每行结尾加上续行符“\”;如果希望一个字符串中包含多行信息,则需要使用换行符“\n”。例:1 s1='Hello\2 World!'#上一行以\作为行尾,说明上一行与当前行是同一条语句3 s2="你好!\n欢迎学习Python语言程序设计!"#通过\n换行4 print(s1)#输出s15 print(s2)#输出s2单引号、双引号、三引号之间的区别使用三引号创建字符串,则允许直接将字符串写成多行的形式。1 str='''你好!2 欢迎学习Python语言程序设计!3 祝你学习愉快!'''#通过一对三引号定义包含多行文本信息的字符串4 print(str)#输出str例:单引号、双引号、三引号之间的区别在使用一对三引号括起来的字符串中,可以直接包含单引号和双引号,不需要使用转义符。1 str='''Hesaid:2 "It'sabookforyou."3 '''#通过一对三引号定义包含多行文本信息的字符串,其中的单引号和双引号不需加转义符4 print(str)#输出str例:字符串比较字符串比较字符串比较规则两个字符串按照从左至右的顺序逐个字符比较,如果对应的两个字符相同,则继续比较下一个字符。01如果找到了两个不同的字符,则具有较大编码的字符对应的字符串具有更大的值。02如果对应字符都相同且两个字符串长度相同,则这两个字符串相等。03如果对应字符都相同但两个字符串长度不同,则较长的字符串具有更大的值。04字符串比较示例例:字符串比较示例。1 str1='Python'2 str2='C++'3 str3='Python3.7'4 str4='Python'5 print('str1大于str2:',str1>str2)6 print('str1小于等于str2:',str1<=str2)7 print('str1小于str3:',str1<str3)8 print('str1大于等于str3:',str1>=str3)9 print('str1等于str4:',str1==str4)10 print('str1不等于str4:',str1!=str4)字符串分割字符串分割split方法使用字符串中的split方法,可以按照指定的分隔符对字符串进行分割,返回由分割结果组成的列表。split方法语法格式为:str.split(sep=None,maxsplit=-1)str是待切割的字符串;sep是指定的分隔符,可以由一个或多个字符组成,其默认值为None,表示按空白符(空格、换行、制表符等)做字符串切割;maxsplit决定了最大切割次数,如果指定了maxsplit值则最多可以得到maxsplit+1个切割结果,其默认值为-1,表示不对最大切割次数做限制。split方法例:split方法使用示例。1 str1='Itisabook!'2 str2='Python##C++##Java##PHP'3 ls1=str1.split()#按空白符对str1做分割,分割结果列表保存在ls1中4 ls2=str2.split('##')#按'##'对str2做分割,分割结果列表保存在ls2中5 ls3=str2.split('##',2)#按'##'对str2做两次分割,分割结果列表保存在ls3中6 print('ls1:',ls1)7 print('ls2:',ls2)8 print('ls3:',ls3)splitlines方法除了split方法,字符串中还提供了一个splitlines方法,该方法固定以行结束符('\r'、'\n'、'\r\n')作为分隔符对字符串进行分割,即每一个分割结果对应原字符串中的一行文本,返回由分割结果组成的列表。splitlines的语法格式为:str.splitlines([keepends])str是待分割的字符串;keepends表示分割结果中是否保留最后的行结束符,如果该参数值为True,则保留行结束符,否则不保留(默认为False,即在分割结果中不保留行结束符)。splitlines方法例:splitlines方法使用示例。1 str="你好!\n欢迎学习Python语言程序设计!\r\n祝你学习愉快!\r"2 ls1=str.splitlines()3 ls2=str.splitlines(True)4 print('ls1:',ls1)5 print('ls2:',ls2)字符串检索和替换字符串检索和替换字符串检索字符串中提供了4种用于进行字符串检索的方法,分别是find、index、rfind、rindex,它们的语法格式分别为:str.find(sub[,start[,end]])str.index(sub[,start[,end]])str.rfind(sub[,start[,end]])str.rindex(sub[,start[,end]])其作用是从字符串str中检索字符串sub出现的位置。start和end参数指定了检索范围,即在切片str[start:end]范围中检索,默认情况下在str[:]范围中(即在整个字符串中)检索。字符串检索find方法是在指定检索范围中按照从左至右的顺序检索,找到字符串sub第一次出现的位置;而rfind方法在指定检索范围中按照从右至左的顺序检索,找到字符串sub最后一次出现的位置。01index与find作用相同,rindex与rfind作用相同,只是find和rfind在检索不到字符串sub时会返回-1,而index和rindex会引发ValueError异常。02字符串检索例:find和rfind方法使用示例。1 str='catdogcatdogcatdog'2 print('str中第一次出现cat的位置为:',str.find('cat'))3 print('str中最后一次出现cat的位置为:',str.rfind('cat'))4 print('str中第一次出现mouse的位置为:',str.find('mouse'))字符串替换使用字符串中的replace方法,可以将字符串中的指定子串替换成其他文本。replace方法的语法格式为:str.replace(old,new[,max])str是要做替换操作的字符串;old和new分别是要替换的子串和替换成的字符串;max是最多替换的子串数量,如果不指定max参数则将所有满足条件的子串替换掉。字符串替换例:字符串替换示例。1 str='catdogcatdogcatdog'2 str1=str.replace('cat','mouse')#将str中的所有'cat'子串替换成'mouse'
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 合伙酒店转让合同范本
- 代替上班合同书协议书
- 公司研发团队合同范本
- 合伙购置机器合同范本
- 俱乐部马匹寄养协议书
- 合伙买卖商业房协议书
- 借款附带担保合同范本
- 合同变更公司补充协议
- 在线教育行业技术规范与市场前景
- 北京土方备案合同范本
- 安全等级保护咨询方案
- 数据共享与安全风险管理措施
- 2025年《护士条例》考试题有答案
- 2025年及未来5年中国节能服务转移行业市场调查研究及投资前景预测报告
- 2025安徽合肥市轨道交通集团有限公司第二批次社会招聘12人笔试参考题库附带答案详解
- 2025年国家工作人员学法用法考试题库附参考答案
- 纹绣眉毛教程课件
- 2025年中国高纯度氧化镁行业市场分析及投资价值评估前景预测报告
- 团课讲座课件
- 2025年及未来5年中国工程总承包行业市场深度分析及发展前景预测报告
- 2025江西上饶余干县天然气有限公司招聘2人考试参考试题及答案解析
评论
0/150
提交评论