版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章数据结构数据结构是计算机科学中用于组织和存储数据的方式,它涉及数据元素之间的关系、操作和存取方法。在Python中,最基本的数据结构为序列,每种序列都有其特点及用法。学习目标掌握Python字符串的格式化与常用操作掌握通用序列的索引、切片和序列操作掌握Python列表的创建与常见操作掌握Python元组的性质与常见类型掌握Python字典的创建与常见操作掌握Python集合的常见操作掌握Python的列表推导式本章主要内容Python序列通用操作Python字符串Python列表Python元组Python字典Python集合数据科学入门:大数定律与中心极限定律4.1Python序列通用操作序列指的是一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通过每个值所在位置的编号即索引进行访问。为了更形象地认识序列,可以将它看作一家旅店,那么店中的每个房间就如同序列存储数据的一个个内存空间,每个房间所特有的房间号就相当于索引值。也就是说,通过房间号(索引)读者可以找到这家旅店(序列)中的每个房间(内存空间)。集合和字典不支持索引、切片、相加和相乘操作。在Python中,序列类型包括字符串、列表、元组、集合和字典,这些序列支持几种通用的操作。字符串列表元组集合字典4.1.1索引索引指的是按一定系统组织起来的记录和指引文献事项或单元知识的检索工具。序列中的每一个元素都有编号,即索引。在Python中,该索引既可以从前往后索引,也可以从后往前索引,即可以是正数,也可以是负数。正向索引从前往后,下标从0开始负向索引从后往前,下标从-1开始下面以字符串"www/qfedu/com"的索引为例,字符串的索引如图4-1所示。图4-1字符串的索引当从前往后索引时,下标从0开始。当从后往前索引时,下标从-1开始,即最后一个元素的索引为-1。索引——使用索引获取序列中的字符使用索引获取序列中的字符,在Python中,使用索引可以访问序列中的任意元素。例如,字符串中的字符可以通过索引来提取,可以从前往后索引,也可以从后往前索引。使用索引获取序列中的元素的语法格式如下。序列[索引]索引是由数字表示,代表所要索引的字符在序列中的位置。例如,使用索引获取"www/qfedu/com"中的字符"q"并打印输出,具体代码如下。word="www/qfedu/com"word[4]#正向索引#或者word[-9]负向索引print(word[4])#或者print(word[-9])字符"q"在字符串"www/qfedu/com"中的正向索引为4,负向索引为-9,两种方式均可访问同一元素。4.1.2切片——语法切片是访问序列中元素的另一种方法,它可以访问一定范围内的元素,通过切片操作,可以生成一个新的序列。使用序列实现切片操作的语法格式如下。序列[前索引:后索引:步长]前索引切片起始位置后索引切片结束位置(不含)步长间隔,省略则为1切片操作访问序列的范围不包括后索引对应的元素,如果省略设置步长的值,则最后一个冒号就可以省略。以字符串切片为例,字符串切片指的是从字符串中截取部分字符组成新的字符串,且不会使原字符串产生变化。切片——字符串切片示例在创建好的"Python程序设计基础"项目中创建Chapter04文件夹,在Chapter04文件夹中创建一个名为strSection.py的文件,获取字符"www/qfedu/com"的某些字符,具体代码如文件4-1所示。文件4-1strSection.pystr="www/qfedu/com"print(str[:2])print(str[::2])print(str[:])在上述代码中,第2行代码获取索引区间为[0,2]之间的字符串,取前两个元素"ww";第3行代码的步长为2,即从左到右,间隔1个字符在整个字符串取值;第4行代码获取整个序列的元素,此时[]中只需一个冒号即可。图4-2文件strSection.py的运行结果第2行代码获取前两个元素"ww";第3行代码从左到右进行间隔取值,获取的字符串为"wwqeucm";第4行代码获取整个序列的元素"www/qfedu/com"。4.1.3序列相加在Python中,支持两种类型相同的序列使用"+"运算符做相加操作,它会将两个序列进行连接,但不会去除重复的元素。下面通过两个示例演示序列相加的操作。(1)多个字符串相加在Chapter04文件夹中创建一个名为Seqadd.py的文件,将多个字符串相加,具体代码如文件4-2所示。文件4-2Seqadd-str.pystr1="初心至善"str2="--"str3="匠心育人"str4="www/qfedu/com"print(str1+str2+str3+str4)#字符串相加图4-3文件Seqadd.py的运行结果数据类型相同指的是"+"运算符的两侧序列可以都是列表、元组或字符串等类型。序列相加——两个列表相加(2)两个列表相加在Chapter04文件夹中创建一个名为Seqadd-list.py的文件,将两个列表相加,具体代码如文件4-3所示。文件4-3Seqadd-list.pylist1=[0,1,2]list2=["字符串:","www/qfedu/com"]print(list1+list2)图4-4文件Seqadd-list.py的运行结果将两个列表相加后,list1中的元素在左,list2中的元素在右。集合和字典不支持索引、切片、相加和相乘操作。4.1.4序列相乘在Python中,支持两种类型相同的序列使用"*"运算符做相乘操作,使用数字n乘以一个序列会生成新的序列,其内容为原来序列被重复n次的结果。在Chapter04文件夹中创建一个名为Seqmulti.py的文件,将两个序列相乘,具体代码如文件4-4所示。文件4-4Seqmulti.pystr="社会主义核心价值观"list=["*",5,"#"]tuple=(1,3)print(str*3)print(list*2)print(tuple*6)在上述代码中,字符串、列表、元组经过相乘,分别重复3、2、6次。图4-5文件Seqmulti.py的运行结果字符串、列表、元组均可以序列相乘,使用数字n乘以一个序列会生成新的序列,其内容为原来序列被重复n次的结果。4.1.5检查元素是否包含在序列中Python中,可以使用in关键字检查某元素是否为序列的成员,其语法格式如下。元素in序列检查字符"c"是否包含在字符串"www/qfedu/com"中。str="www/qfedu/com"print('c'instr)运行结果如下。True运行结果为True,表示字符"c"包含在字符串"www/qfedu/com"中,若运行结果为False,表示不在字符串中。notin关键字和in关键字用法相同,用来检查某个元素是否不包含在指定的序列中。in检查元素是否在序列中,返回True/Falsenotin检查元素是否不在序列中,返回True/False拓展阅读:和序列相关的内置函数Python提供了几个内置函数,可用于实现与序列相关的一些常用操作,和序列相关的内置函数如表4-1所示。表4-1和序列相关的内置函数函数说明len()计算序列的长度,即返回序列中包含多少个元素max()找出序列中的最大元素min()找出序列中的最小元素list()将序列转换为列表str()将序列转换为字符串sum()计算元素和sorted()对元素进行排序reversed()反向序列中的元素enumerate()将序列组合为一个索引序列,多用在for循环中说明:部分序列不能应用其中的部分函数,比如字典中不能直接使用list。Python提供了len()函数计算字符串的长度,语法格式如下。len(string)其中string为要进行长度计算的字符串。例如,计算字符串"www/qfedu/com"的长度:print(len("www/qfedu/com"))#运行结果:13len()函数在计算字符串长度时,不区分字母、汉字、数字、标点和特殊字符等,例如,字符串"学习Python使我快乐!#¥",使用len()函数计算其长度,"学"、"P"、"!"、"#"等各占一位,字符串长度为15。4.1.6查找与统计元素个数index()方法可以查找序列中第一次出现某个元素的索引,如果序列中没有此元素则报错,语法格式具体如下。序列.index(x[,i[,j]])语句返回序列seq中从位置i到j(不包含j)第1次出现元素x的索引。count()方法可以统计序列中出现某个元素的次数,语法格式具体如下。序列.count(x)该语句返回序列seq中出现元素x的总次数。index()查找第一次出现的索引,不存在则报错count()统计元素出现的总次数查找与统计元素个数——示例在Chapter04中创建一个seek-count.py文件,具体代码如文件4-5所示。文件4-5seek-count.pylist01=["hello",123,"Python",123]print("列表中第一次出现元素123的索引为:",list01.index(123))print("列表中出现123的总次数为:",list01.count(123))print("列表中第一次出现元素'123'的索引为:",list01.index('123'))图4-6文件seek-count.py的运行结果index()函数的作用是查找序列中第一次出现元素123的索引。count()方法的作用是当寻找的元素不存在时,程序会发生异常,列表list01中只含有数字123,并没有字符串123,故使用index()方法找不到字符串123。4.2Python字符串字符串是许多单个子串组成的序列,主要是用来表示文本。例如,登录网站时输入的用户名与密码等。灵活地使用与处理字符串,对于Python程序员来说是非常重要的。本节将从字符串的格式化、拼接、重复、f字符串及常用操作等方面进行讲解。字符串格式化字符串拼接f字符串常用操作4.2.1字符串格式化——基本概念字符串格式化指的是预先制定一个带有空位的模板,然后根据需要对空位进行填充。例如,预先制定一个模板"___年的___学期我学习了___门课程",然后在下画线的位置填充内容,可以用以下代码实现。print("{}年{}学期我学习了{}门课程".format(2023,"上",20))#输出结果:2023年上学期我学习了20门课程1.转义字符字符串中除了可以包含数字字符、字母字符或特殊字符外,还可以包含转义字符。转义字符以反斜杠"\"开头,后跟若干个字符。转义字符具有特定的含义,不同于字符原有的意义,故称转义字符。常用的转义字符及含义如表4-2所示。表4-2常用的转义字符及含义转义字符说明转义字符说明\(在行尾时)续行符\\反斜杠符\n回车换行\t横向制表符\b退格\r回车\f换页\'单引号符\"双引号符\a鸣铃\ddd1~3位八进制数所代表的字符\xhh1~2位十六进制数所代表的字符在表4-2中,\ddd和\xhh都是用ASCII码表示一个字符,如\101和\x41都是表示字符A。例如,想在单引号标识的字符串中包含单引号可以使用\',具体代码如下。str='I\'lldomybest.'如果想禁用字符串中反斜杠转义功能,可以在字符串前面添加一个字符r,具体代码如下。print(r'\n表示回车换行')#输出\n表示回车换行2.format()方法——基本语法字符串格式化指的是按照指定的规则连接、替换字符串并返回新的符合要求的字符串,字符串格式化的语法格式如下。模板字符串.format(参数列表)模板字符串中有一系列用{}表示的空位,format()方法可以将以逗号间隔的参数列表按照对应关系替换到这些空位上。无参数序号{}中没有序号,按照出现的顺序进行替换有参数序号{}中指定了参数序号,按照从0开始的序号替换对应的参数图4-7format方法空位无参数序号图4-8format方法空位有参数序号当改变参数编号时,对应位置的数据将发生变化。3.格式化符号——格式处理顺序format()方法的模板字符串的空位中不仅可以填写参数序号,还可以有其他的格式处理形式,格式处理内容要按照以下顺序使用。(1)填充填充单个字符,不指定时用空格填充(2)对齐<为左对齐,>为右对齐,^为居中对齐(3)符号+表示正数加正号,负数加负号;-表示正数不变,负数加负号;空格表示正数加空格,负数加负号(4)宽度指定空位所占宽度(5)分隔符用逗号分隔数字的千位,适用于整数和浮点数(6)精度用.precision指定浮点数的精度或字符串输出的最大长度,如.5(7)类型用于指定类型格式化符号——常用的格式化符号表4-3常用的格式化符号格式化符号说明格式化符号说明%c格式化字符%s格式化字符串%d格式化整数%u格式化无符号整型%o格式化无符号八进制数%x格式化无符号十六进制数(小写)%X格式化无符号十六进制数(大写)%f或%F格式化浮点数字,可指定小数点后的精度%e用科学记数法格式化浮点数(e小写)%E用科学记数法格式化浮点数(E大写)%g自动判断转换为%e或%f%G自动判断转换为%E或%F%%输出%表4-4辅助格式化符号辅助格式化符号说明*定义宽度或小数点的精度-左对齐+对正数输出正值符号"+"#在八进制数前显示0,在十六进制前显示0x或0Xm.nm是显示的最大总宽度,n是小数点后的位数,数字的大小不满足m.n时,用空格补位0数字的大小不满足m.n时,用0补位格式化符号——示例(1)填充、对齐、宽度处理(1)使用format()方法对序列填充、对齐与宽度等格式进行处理在Chapter04中创建一个名为OutputStu.py的文件,具体代码如文件4-6所示。文件4-6OutputStu.pyname,age,id,score="小千",23,10,99print("学号:%d\n姓名:%s\n年龄:%d\n成绩:%f"\%(id,name,age,score))文件OutputStu.py为格式化输出学生的学号、姓名、年龄与成绩等信息。图4-9文件OutputStu.py的运行结果%d表示格式化整数;%s表示格式化字符串;%f表示格式化浮点数字,默认情况下,保留小数点后6个数字;\n表示换行符;\表示续航符。格式化符号——示例(2)分隔符、精度、类型处理(2)使用format()方法对序列分隔符、精度与类型等格式进行处理在Chapter04中创建一个名为OutputKC.py的文件,具体代码如文件4-7所示。文件4-7OutputKC.pyexercise=310calories=3220.123638print("卡路里为{0:*>20,}".format(calories))print("我运动了{0:.1f}分钟,消耗了{1:,.2f}卡路里".format(exercise,calories))文件OutputKC.py为格式化输出运动时长和消耗卡路里等信息。第3行代码表示将"卡路里为"格式化输出在右侧,并使用星号*分隔;第4行代码表示将变量exercise转换为一位精度的浮点数,并设置变量calories的精度为两位,.1f表示格式化输出为浮点型数据,保留小数点后1个数字;同样,.2f表示格式化输出为浮点型数据,保留小数点后2个数字。图4-10文件OutputKC.py的运行结果运行结果为"卡路里为********3,220.123638",使用星号间隔;"我运动了310.0分钟,消耗了3,220.12卡路里"数据精度分别是一位、两位。4.f字符串f-strings即f字符串,其格式化处理与format()方法类似,但语法比其简洁。Python3.6及以后的版本推荐使用f字符串进行字符串的格式化。f字符串用花括号"{}"表示被替换的字段。在Chapter04中创建一个OutputStuInfo.py文件,使用f字符串的方法格式化输出学生信息,具体代码如文件4-8所示。文件4-8OutputStuInfo.pyname="小千"studentId="202305"print(f"我叫{name},学号为{studentId}")在上述代码中,使用变量存储字符串内容,f字符串使用{}表示被替换的字段,使用变量名studentId获取字段内容。图4-11文件OutputStuInfo.py的运行结果使用f字符串进行格式化处理字符串,结果为"我叫小千,学号为202305"。拓展阅读:Python3.9以来的新特性Python3.9将两个新函数添加到str对象:str.removeprefix(prefix)#用于删除前缀str.removesuffix(suffix)#用于删除后缀4.2.2常用方法——字符大小写转换字符串的常用方法包括字符大小写转换、判断字符内容、分割和合并字符串、检索子串、替换子串、去除空格及计算字符串的长度等。1.字符大小写转换Python有部分方法可以实现字符串的大小写转换,字符串大小写转换方法如表4-5所示。表4-5字符串大小写转换方法方法说明sname.title()将字符串中的每个单词首字母大写sname.upper()将字符串中所有字母转为大写sname.lower()将字符串中所有字母转为小写在表4-5中,使用sname来表示字符串或字符串变量,其中的方法均返回一个新的字符串,原字符串不变。在Chapter04中创建一个str-transform.py文件,将字符进行首字母大写、每个字符大写及每个字符小写等操作,具体代码如文件4-9所示。文件4-9str-transform.pystr="Liferarelygivesyouachancetoreverseapastregret!(不问遗憾,勇敢前行!)"print("str.title():",str.title())print("str.upper():",str.upper())print("str.lower():",str.lower())图4-12文件str-transform.py的运行结果第1行将首字母大写;第2行将字符串每个单词的每个字符大写;第3行将字符串的每个单词的所有字符小写。2.判断字符内容Python提供了判断字符串中是否包含某些字符的方法,以下用sname来表示字符串或字符串变量,判断字符串内容的方法如表4-6所示。表4-6判断字符串内容的方法方法说明sname.isupper()当字符串中所有字符都是大写时返回True,否则返回Falsesname.islower()当字符串中所有字符都是小写时返回True,否则返回Falsesname.isalpha()当字符串中所有字符都是字母或中文字时返回True,否则返回Falsesname.isnumeric()当字符串中所有字符都是数字时返回True,否则返回Falsesname.isspace()当字符串中所有字符都是空格时返回True,否则返回False在Chapter04中创建一个str-password.py文件,判断密码内容是否为字符串且同时包含数字与字母,具体代码如文件4-10所示。文件4-10str-password.pypassword=input("请输入您的密码(必须包含数字与字母):")print("密码是否全是字母:",password.isalpha())print("密码是否全是数字:",password.isnumeric())图4-13文件str-password.py的运行结果输入的密码为qf1234,判断的结果为密码内容既不是全是字母,又不是全是数字,因此,可以验证密码是否符合要求。3.分割和合并字符串字符串可以用特定字符分割为列表形式,列表及其他的可迭代对象也可以合并为一个字符串。字符串分割和合并方法如表4-7所示。表4-7字符串分割和合并方法方法说明sname.split(sep=None,maxsplit=-1)字符串用sep分割后以列表形式返回sname.join(iterable)将可迭代对象iterable用字符sname拼接在一起,返回一个合并后的新字符串在Chapter04中创建一个Divide-merge-str.py文件,具体代码如文件4-11所示。文件4-11Divide-merge-str.pysname="Life-rarely-gives-you-a-chance-to-reverse-a-past-regret!"list01=sname.split("-")#将sname字符串以"-"分割print(list01)join_str="~".join(list01)#用"~"将list01列表中的元素连接起来print(join_str)图4-14文件Divide-merge-str.py的运行结果将字符串以"-"分隔后以列表形式返回,使用"~"将列表中的元素连接起来后,返回的是新的字符串。4.检索子串Python提供了多种方法查找、统计字符串中的特定内容。字符串检索方法如表4-8所示。表4-8字符串检索方法方法说明sname.count(sub[,start[,end]])返回sname[start:end]中sub子串出现的次数,如果字符串中没有sub子串则返回0sname.find(sub[,start[,end]])返回sname[start:end]中首次出现sub子串的索引,如果字符串中没有sub子串则返回-1sname.index(sub[,start[,end]])返回sname[start:end]中首次出现sub子串的索引,如果字符串中没有sub子串则报错sname.startswith(prefix[,start[,end]])检测sname[start:end]是否以prefix子串开头,如果是则返回True,否则返回Falsesname.endswith(suffix[,start[,end]])检测sname[start:end]是否以suffix子串结尾,如果是则返回True,否则返回False检索子串——示例在Chapter04中创建一个retrieval-str.py文件,具体代码如文件4-12所示。文件4-12retrieval-str.pysname="count方法的用处是返回sname[start:end]中sub子串出现的次数"print("sname中s出现的次数是:",sname.count("s"))print("sname中count子串的索引是:",sname.find("count"))print("sname中'返回'子串的索引是:",sname.index("返回"))print("sname是以'方法'为开头吗:",sname.startswith("方法"))print("sname是以'次数'为结尾吗:",sname.endswith("次数"))图4-15文件retrieval-str.py运行结果打印字符串中字符s出现的次数为3、子串的索引为0、子串"返回"的索引为11、子串开头的字符不是以"方法"为开头,结尾的字符是以"次数"为结尾。在文件retrieval-str.py中,使用index()方法时,没有检索到子串时会报错,具体代码如下。sname="Python"sname.index("c")此时在单词"Python"中没有检索到子串"c",程序发生异常,异常类型为ValueError,表示传入了无效的参数。图4-16异常类型为ValueError的异常信息5.替换子串文字处理软件一般会有查找并替换的功能。在Python程序中,可以通过replace()方法来实现字符串的替换,其语法格式如下。sname.repalce(old,new[,count])在上述语句中,sname为字符串或字符串变量,sname中所有的old子串被替换为new,如果传入参数count,则前count个old子串被替换。例如,在一个字符串中出现了错别字,可以利用replace()方法进行错别字替换,返回新的字符串,原字符串不变。在Chapter04中创建一个名为repalce-str.py文件,具体代码如文件4-13所示。文件4-13repalce-str.pysname="林花谢了春红,太葱葱,无奈朝来寒雨晚来风。"new_str=sname.replace("葱葱","匆匆")print("错别字替换后的字符串为:",new_str)图4-17文件repalce-str.py的运行结果将字符串"林花谢了春红,太葱葱,无奈朝来寒雨晚来风。"中的子串"葱葱"替换为"匆匆"。6.去除特定字符字符串中有时候会出现多余的空格或空白行,此时,为了获取字符串中有效的内容,可以对其中的多余字符进行去除,返回新的字符串,原字符串不变。字符串去除多余字符的方法如表4-9所示。表4-9字符串去除多余字符的方法方法说明sname.strip([chars])在字符串左侧和右侧去除chars中列出的字符sname.lstrip([chars])在字符串左侧去除chars中列出的字符sname.rstrip([chars])在字符串右侧去除chars中列出的字符在表4-9中,chars为可选参数,用于指定需要去除的字符,可以指定多个。如果不指定此参数,则默认去除空格、制表符\t、回车符\r和换行符\n等。在Chapter04中创建一个remove-str.py文件,调用sname.strip()方法去除多余字符,具体代码如文件4-14所示。文件4-14remove-str.pysname="#山外青山楼外楼寄意寒星荃不察,我以我血荐轩辕*"new_str=sname.strip("#*")#去掉多余字符#和*,将新字符串赋给new_strprint(new_str,end="")#设置end为空,使打印结果不换行图4-18文件remove-str.py的运行结果成功去除字符串"#山外青山楼外楼寄意寒星荃不察,我以我血荐轩辕*"左侧和右侧的字符"#"和"*"。4.2.3正则表达式——基本概念正则表达式(RegularExpression,RE)是文本处理方面功能十分强大的工具之一。正则表达式是由一些普通字符(纯文本)和有特殊含义的特殊字符(元字符)构成的高度简练的字符串,用来描述或匹配一系列符合某种规则的字符串。例如,一个正则表达式"\d{15}$|^\d{17}(\d|x|X)$"能够描述或匹配满足这样规则的一系列字符串:15位数字或17位数字,再加一个数字或一个字母x或X,所以13020375081200137010520050601075X都能匹配。一个正则表达式通常称为一个模式(Pattern),通常使用正则表达式完成字符串的搜索、替换和分割操作。Python语言对正则表达式的支持功能都包含在re模块中,使用时需要导入re模块,re模块使Python语言拥有全部的正则表达式功能。搜索替换分割1.re.match函数——语法与flagsre.match函数尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回none。re.match函数的语法具体如下所示。re.match(pattern,string,flags=0)参数中,pattern指的是匹配的正则表达式;string指的是要匹配的字符串;flags指的是标志位,用于控制正则表达式的匹配方式,如是否区分大小写、多行匹配等,正则表达式常见的flags如表4-10所示。表4-10正则表达式常见的flags方法说明re.I(re.IGNORECASE)使匹配对大小写不敏感re.M(MULTILINE)多行匹配,影响^和$re.S(DOTALL)使.匹配包括换行在内的所有字符re.X(VERBOSE)正则表达式可以是多行,忽略空白字符,并可以加入注释正则表达式修饰符使用"-"作为选项标志,正则表达式可以包含一个可选的修饰符来控制匹配的各个方面。re.match函数——span()示例在Chapter04中创建一个regular-match-str.py文件,具体代码如文件4-15所示。文件4-15regular-match-str.pyimportreprint(re.match('http','http:://www.fengyunedu.con').span())#在起始位置匹配print(re.match('con','http:://www.fengyunedu.con'))#不在起始位置匹配在上述代码中,通过span()获取匹配的位置,返回一个元组包含匹配"(开始,结束)"的位置,取值区间左闭右开,即返回的是范围。图4-19文件regular-match-str.py的运行结果返回(0,4)表示正则表达式匹配成功;返回None表示正则表达式匹配失败re.match函数——分组匹配示例可以使用group(num)或groups()方法匹配对象函数来获取匹配表达式,下面通过一个示例演示re.match方法匹配模式的使用方法。在Chapter04中创建一个re-match.py文件,具体代码如文件4-16所示。文件4-16re-match.pyimportreline="Catsaresmarterthandogs"matchObj=re.match(r'(.*)are(.*?).*',line,re.M|re.I)ifmatchObj:print("matchObj.group():",matchObj.group())print("matchObj.group(1):",matchObj.group(1))print("matchObj.group(2):",matchObj.group(2))else:print("Nomatch!!")在上述代码中,r表示字符串为非转义的原始字符串;(.*)为第一个匹配分组;(.*?)为第二个匹配分组,?代表非贪婪模式;使用异或符号|提供多个修饰符re.I和re.M。图4-20文件re-match.py的运行结果matchObj.group()等同于matchObj.group(0),表示匹配到完整文本字符;matchObj.group(1)得到第一组匹配结果,结果为Cats;matchObj.group(2)得到第二组匹配结果,结果为smarter。因为匹配结果中只有两组,所以如果填3时会报错。2.re.search方法——语法与示例re.search扫描整个字符串并返回第一个成功的匹配,语法结构如下。re.search(pattern,string,flags=0)re.search()方法返回一个匹配的对象,否则返回None;也可以使用group(num)或groups()匹配对象函数来获取匹配表达式。在Chapter04中创建一个re-search.py文件,具体代码如文件4-17所示。importreline="Catsaresmarterthandogs";searchObj=re.search(r'(.*)are(.*?).*',line,re.M|re.I)ifsearchObj:print("searchObj.group():",searchObj.group())print("searchObj.group(1):",searchObj.group(1))print("searchObj.group(2):",searchObj.group(2))else:print("Nothingfound!!")图4-21文件re-search.py的运行结果比较图4-20与图4-21可知,运行结果相同,下面通过一个示例演示两者的具体区别。re.search与re.match的区别在Chapter04中创建一个名为difference-search-match.py文件,具体代码如文件4-18所示。文件4-18difference-search-match.pyimportreline="Catsaresmarterthandogs";matchObj=re.match(r'dogs',line,re.M|re.I)ifmatchObj:print("match-->matchObj.group():",matchObj.group())else:print("Nomatch!!")searchObj=re.search(r'dogs',line,re.M|re.I)ifsearchObj:print("search-->searchObj.group():",searchObj.group())else:print("Nothingfound!!")图4-22文件difference-search-match.py的运行结果re.match只匹配字符串的开始,故匹配字符串"dogs"失败,返回Nonere.search匹配整个字符串,故匹配字符串"dogs"成功,返回匹配的对象3.pile方法compile函数用于编译正则表达式,生成一个正则表达式(Pattern)对象,使用pile()可以提高程序的效率,尤其是在需要多次使用同一正则表达式进行匹配时,语法结构如下。pile(pattern[,flags])在Chapter04中创建一个mail.py文件,使用pile方法匹配邮箱格式。具体代码如文件4-19所示。文件4-19mail.pyimportreemail="example@"pattern=pile(r'\w+@\w+\.[a-z]{2,3}')#将正则表达式匹配为邮箱格式ifre.match(pattern,email):print("邮箱格式正确")else:print("邮箱格式错误")pile(r'\w+@\w+.[a-z]{2,3}')中"\w"表示匹配非特殊字符;"@\w"表示将"@"加入可匹配的字符;".[a-z]{2,3}"表示不需要数字2~3个,如".com"格式有2~3个。另外,pile()还支持一些可选参数,包括re.DEBUG、re.IGNORECASE、re.MULTILINE、re.DOTALL。图4-23使用pile方法匹配邮箱格式的运行结果使用pile方法匹配到的邮箱格式正确。4.re.findall方法搜索整个字符串,返回一个列表,语法结构如下。re.findall(pattern,string,flags=0)返回字符串中所有模式的非重叠的匹配,作为字符串列表,该字符串扫描从左到右,并匹配返回的顺序。在Chapter04中创建一个Extracthtnl.py文件,使用re.findall方法提取HTML文件中所有的超链接,具体代码如文件4-20所示。文件4-20Extracthtnl.pyimportrehtml='锋云智慧,OA'pattern=pile(r'(.*?)')matches=pattern.findall(html)print(matches)formatchinmatches:print(match[0],match[1])图4-24文件Extracthtnl.py的运行结果re.findall方法从左到右搜索整个字符串,返回的数据是列表类型,由第6行代码可知,将分别打印列表的两个元素,即返回的数据为两组。5.re.sub方法Python的re模块提供了re.sub方法用于替换字符串中的匹配项,语法结构如下。re.sub(pattern,repl,string,count=0,flags=0)re.sub方法的pattern、repl、string参数为必选参数,count=0与flags=0参数为可选参数。其中:pattern为正则中的模式字符串repl为替换的字符串,也可为一个函数string为要被查找替换的原始字符串count为模式匹配后替换的最大次数,默认为0,表示替换所有的匹配flags为编译时用的匹配模式,flags=0表示使用默认的匹配模式,默认的匹配模式是区分大小写的,^和$分别匹配字符串的开头和结尾由于工作人员录入习惯的不同,文件存储的电话号码可能会有差异,为了统一,需要删除注释、移除非数字内容等操作,才能为人们所用。re.sub方法——电话号码处理示例在Chapter04中创建一个名为phone.py文件,使用正则表达式匹配所有的数字,具体代码如文件4-21所示。文件4-21phone.pyimportrephone="2023-959-559#这是一个电话号码"num=re.sub(r'#.*$',"",phone)#删除注释print("电话号码:",num)num=re.sub(r'\D',"",phone)#移除非数字的内容print("电话号码:",num)在上述代码中,使用re.sub方法替换匹配的字符串匹配,第3行代码删除了#符号及之后的字符串,而#符号及之后的字符串属于注释,第3行代码就等价于删除了第2行代码的注释;第5行代码删除所有非数字的内容,即删除连接符-。图4-25文件phone.py的运行结果使用re.sub方法删除注释后的字符串为"电话号码:2023-959-559";移除非数字的内容后,字符串为"电话号码:2023959559"。6.re.split方法split方法按照能够匹配的子串将字符串按照正则表达式匹配的结果进行分割,返回列表类型,语法结构如下。re.split(pattern,string[,maxsplit=0,flags=0])参数maxsplit表示分割次数,当maxsplit=1时,分割一次;默认值为0,即不限制次数。在Chapter04中创建一个名为split-time.py文件,使用re.split()方法将一个包含不同格式日期的字符串按照年月日顺序进行分割,具体代码如文件4-22所示。文件4-22split-time.pyimportredate_time='2023.05.01/12-30-00'pattern='[./-]'result=re.split(pattern,date_time)print(result)在上述代码中,正则表达式模式[./-]匹配字符串中的"."、"/"和"-",调用re.split()方法实现分割字符串的效果。图4-26文件split-time.py的运行结果正则表达式模式分割得到的子字符串分别为2023、05、01、12、30和00,去除正则表达式中的连接符号后,返回的是列表型数据。4.3Python列表在第2.2.2节已经学习了列表的含义及创建方法,列表的元素可以是不同类型的数据,这使得程序处理不同类型数据变得更加容易。本节主要对Python的列表操作进行讲解,包括访问列表元素、遍历列表、对列表进行操作、对列表元素进行操作及列表推导式等内容。访问列表元素索引与切片方式访问遍历列表while、for、range()、enumerate()四种方式对列表进行操作运算与排序对列表元素进行操作添加、修改、删除元素列表推导式简洁快速创建列表4.3.1访问列表元素——索引方式列表同字符串一样,支持双向索引,既可以用非负数表示索引,也可以用负数表示索引,列表索引如图4-27所示。1.通过索引访问列表中的一个元素在list1=[1,2,3,4,5,6,7,8]中,第4个元素为list1[3],因为第4个元素也是倒数第5个元素,所以也可以通过list[-5]访问。如果指定下标不存在,则会抛出异常。正向索引list1[3]→第4个元素负向索引list1[-5]→倒数第5个元素图4-27列表索引访问列表元素——切片索引示例2.通过切片索引访问列表中的多个元素列表的切片可以从列表中取得多个元素并组成一个新列表。在Chapter04中创建一个名为split-list.py文件,使用列表的切片索引访问多个列表元素,具体代码如文件4-23所示。文件4-23split-list.pylist1=[1,2,3,4,5,6,7,8]print(list1[2:6])print(list1[2:6:2])print(list1[:6])print(list1[2:])print(list1[-6:-2])print(list1[-6:-2:2])print(list1[::-2])图4-28文件split-list.py的运行结果对原列表list1进行切片操作后返回一个新列表,原列表并没有发生任何变化。4.3.2遍历列表——while循环遍历列表的遍历即获取列表中每一个元素的值,常用的遍历方式有4种:while循环直接遍历、for循环直接遍历、range()函数索引遍历及enumerate()函数遍历。1.while循环遍历通过while循环遍历列表,需要使用len()函数,该函数可以获取序列中元素的个数。在Chapter04中创建一个while-list.py文件,具体代码如文件4-24所示。文件4-24while-list.pylist=['积极培育和践行社会主义核心价值观:','富强、民主、文明、和谐,','自由、平等、公正、法治,','爱国、敬业、诚信、友善']length,i=len(list),0whilei<length:print(list[i])i+=1在上述代码中,将使用len()函数获取列表的个数作为while循环的条件,while循环通过控制变量i来遍历列表中的元素,最终完成对列表中所有的元素进行访问。图4-29文件while-list.py的运行结果列表中的每个元素被换行打印。遍历列表——for循环直接遍历2.for循环直接遍历由于列表是序列的一种,因此通过for循环遍历列表非常简单,只需将列表名放在for语句中in关键词之后即可。在Chapter04中创建一个名为for-list.py文件,具体代码如文件4-25所示。文件4-25for-list.pylist=['积极培育和践行社会主义核心价值观:','富强、民主、文明、和谐,','自由、平等、公正、法治,','爱国、敬业、诚信、友善']forvalueinlist:print(value)在上述代码中,for循环依次将列表中的元素赋值给value并通过print()函数输出。图4-30文件for-list.py的运行结果for循环遍历列表并通过print()函数输出。遍历列表——range()函数索引遍历3.range()函数索引遍历用range()函数进行列表的索引遍历,可以分解为以下3步。通过len(list)获得列表list的长度通过range(len(list))获取列表list的所有序列,从0到len(list)-1通过for循环获取list中的每个索引对应的元素在Chapter04中创建一个for-range-list.py文件,具体代码如文件4-26所示。文件4-26for-range-list.pyfruit_list=["苹果","香蕉","橘子","芒果"]foriinrange(len(fruit_list)):print(f"索引为{i}的元素是{fruit_list[i]}")图4-31文件for-range-list.py的运行结果遍历获取索引为0~3的元素,并换行打印。遍历列表——enumerate()函数遍历4.enumerate()函数遍历enumerate()函数用于将一个可遍历的数据对象,如列表、元组、字符串等,变为一个索引序列,同时输出索引和元素内容,一般与for循环一起使用。在Chapter04中创建一个enumerate-list.py文件,具体代码如文件4-27所示。文件4-27enumerate-list.pyfruit_list=["苹果","香蕉","橘子","芒果"]forindex,iteminenumerate(fruit_list):print(f"索引为{index}的元素是{item}")在上述代码中,使用enumerate()函数将列表变为一个索引序列,同时输出索引和元素内容。图4-32文件enumerate-list.py的运行结果分别换行打印索引为0~3的元素内容。4.3.3对列表进行操作——列表运算1.对列表进行运算列表与字符串类似,也可以进行一些运算,列表的运算如表4-11所示。表4-11列表的运算运算符说明+列表连接*重复列表元素[]索引列表中的元素[:]对列表进行分片in如果列表中包含给定元素,返回Truenotin如果列表中包含给定元素,返回False需要注意的是,列表属于序列,列表的运算与序列相同。对列表进行操作——sort()方法排序2.对列表进行排序开发者可以使用sort()方法对列表进行永久排序或使用sorted()函数对列表进行临时排序。在Chapter04中创建一个ageSort.py文件,使用sort()方法对年龄列表进行排序,具体代码如文件4-28所示。文件4-28ageSort.pyage_list=[17,16,18,19,16,18]age_list.sort()#从小到大进行排序print(age_list)age_list.sort(reverse=True)#从大到小进行排序print(age_list)图4-33文件ageSort.py的运行结果对年龄列表age_list进行排序时,使用sort()方法后排序结果无法恢复原顺序,如果想要年龄从大到小排序,则需要用到reverse参数。sort()方法默认从小到大排序,传递参数reverse=True时,即可实现从大到小排序。对列表进行操作——sorted()方法临时排序下面通过一个示例演示sorted()方法的使用。在Chapter04中创建一个名为sortedage.py文件,使用sorted()方法实现临时从小到大进行排序,具体代码如文件4-29所示。文件4-29sortedage.pyage_list=[17,16,18,19,16,18]sort_list=sorted(age_list)print("排序后的列表:",sort_list)print("原列表:",age_list)在上述代码中,使用sorted()函数对年龄从小到大进行排序。图4-34文件sortedage.py的运行结果使用sorted()函数后原列表的顺序没有发生改变,sorted()函数也可以传入参数reverse=True,可以对年龄从大到小进行排序。4.3.4对列表元素进行操作——添加列表元素1.添加列表元素列表对象提供了3个方法实现添加列表元素,分别为append()方法、extend()方法和insert()方法。append()在列表末尾追加元素,追加元组或列表时,将其视为一个整体元素extend()在列表末尾追加元素,追加元组或列表时,逐个添加其中的元素insert()将指定对象插入列表的指定位置,也会将列表或元组视为一个整体在Chapter04中创建一个append.py文件,具体代码如文件4-30所示。文件4-30append.pylist=['Python','C++','Java']list1=["爱国","敬业","诚信"]list.append('PHP')#追加元素list1.extend("友善")#追加元素print(list)print(list1)...图4-35文件append.py的运行结果添加单个元素时,两者作用相同;append()方法追加元组,整个元组被当成一个元素;而extend()方法追加元组与列表时,不会把列表或者元组视为一个整体,而是把它们包含的元素逐个添加到列表中。对列表元素进行操作——insert()方法下面通过一个示例演示insert()方法的使用。在Chapter04中创建一个insert.py文件,使用insert()方法对列表添加元素,具体代码如文件4-31所示。文件4-31insert.pylist=["富强","文明","和谐"]list.insert(1,"民主")print('列表插入元素后为:',list)图4-36文件insert.py的运行结果可使用insert()方法对列表插入元素,通过指定索引确定插入的位置。对列表元素进行操作——修改列表元素2.修改列表元素修改列表中的元素就是将元素重新赋值,可以通过直接赋值的方法替换某个索引位置或者某个切片位置的元素。在Chapter04中创建一个名为replace.py的文件,替换列表元素,具体代码如文件4-32所示。文件4-32replace.pylist=["富强","爱国","文明","和谐"]list[1]="民主"print('列表替换索引位置元素后为:',list)图4-37文件replace.py的运行结果可使用替换索引位置的元素替换列表元素对列表元素进行操作——删除列表元素3.删除列表元素删除列表中元素有3种方式,分别是pop()方法、remove()方法和del语句。在Chapter04中创建一个del-list.py文件,使用del语句来删除列表的元素,具体代码如文件4-33所示。文件4-33del-list.pylist=['Python','C++','Java','PHP',('JavaScript','C#','Go'),['Ruby','SQL']]dellist[4]print(list)图4-38文件del-list.py的运行结果使用del语句删除列表中索引为4的元素,即删除列表中的元组。4.3.5列表推导式——基本语法Python推导式是一种独特的数据处理方式,可以从一个数据序列构建另一个新的数据序列的结构体。Python支持各种数据结构的推导式,如列表(list)推导式、字典(dict)推导式。Python列表推导式是一种简洁的写法,用于快速创建列表。它通常由一组方括号和一个表达式组成,表达式用于生成列表元素,其基本语法如下。[表达式for变量in列表]或者[表达式for变量in列表if条件]其中表达式是生成列表元素的表达式,可以是有返回值的函数,变量是在迭代中获取的变量,可以是列表、元组、字符串、集合等可迭代对象。if条件语句,可以过滤列表中不符合条件的值。表达式生成列表元素的表达式for变量in列表迭代获取变量if条件(可选)过滤不符合条件的值列表推导式——平方数示例在Chapter04中创建一个listcom.py文件,创建1~10的整数的平方组成的列表,具体代码如文件4-34所示。文件4-34listcom.pylist=[]forxinrange(1,11):list.append(item**2)print(list)在上述代码中,通过for循环遍历1~10的整数并计算出平方值,然后添加到列表list中。文件listcom.py中的代码有更简单的写法,即列表推导式。用列表推导式生成此列表,具体代码如下。list=[x**2forxinrange(1,11)]print(list)在上述代码中,list是最终要生成的列表;x**2是表达式,用于生成要存储到列表中的值;for循环用于给表达式提供值,"forxinrange(1,11)"将值1~10提供给表达式x**2。图4-39文件listcom.py的运行结果创建1~10的整数的平方组成的列表,结果为列表[1,4,9,16,25,36,49,64,81,100]。列表推导式——带条件的奇数平方示例列表推导式提供了一种创建列表的简洁方法,通常是操作某个序列的每个元素,并将其结果作为新列表的元素,或者根据判定条件创建子序列。列表推导式一般由表达式及for语句构成,其后还可以有零到多个for子句或if子句,返回结果是表达式在for语句和if语句的操作下生成的列表。在Chapter04中创建一个listcom2.py文件,用于创建一个由1到10的奇数平方组成的列表,具体代码如文件4-35所示。文件4-35listcom2.pynew_list=[x**2forxinrange(1,11)ifx%2!=0]print(new_list)在上述代码中,表达式是x**2,变量是xinrange(1,11),条件表达式是ifx%2!=0,表示仅选择奇数。图4-40创建一个由1到10的奇数平方组成的列表变量new_list的输出结果是[1,9,25,49,81],分别为1,3,5,7和9的平方。总之,Python的列表推导式是一种快速构建列表的方法,其语法简单而强大,可以根据需求很容易地实现元素的筛选和变换。4.4实验:模拟评委评分实验:模拟评委评分——实验目的与要求【实验目的】掌握列表的创建方法掌握列表排序的方法掌握去除列表指定元素的方法掌握计算平均值的方法【实验要求与内容】假设有5名评委对一位选手的表现进行评分,评分标准为0~10分,要求去掉一个最高分和一个最低分,求该选手的最终得分。具体步骤如下。创建包含评委评分的列表将列表的元素从小到大进行排序去除最大值与最小值计算剩余数据的平均值打印最终评分图4-41模拟评委评分的程序流程图使用顺序结构便可以实现模拟评委评分的系统。实验:模拟评委评分——评分数据与去除最高低分【实验步骤】1.生成5个随机数作为评委的评分在Chapter04文件夹中创建一个Mock-judging.py文件,使用列表存储5个浮点型数据,具体代码如文件4-36所示。文件4-36Mock-judging.pyscores=[7.8,8.2,8.3,7.9,8.6]2.去掉一个最高分和一个最低分在Mock-judging.py文件中,先对列表元素从小到大进行排序,再去掉第1个和最后1个元素,即去除最低分和最高分,具体代码如下所示。scores.sort()#先对列表进行排序scores=scores[1:-1]#去掉第一个元素(最低分)和最后一个元素(最高分)步骤1创建评分列表scores=[7.8,8.2,8.3,7.9,8.6]步骤2sort()排序后用切片去除首尾元素实验:模拟评委评分——计算平均分与实验结果3.计算平均分在Mock-judging.py文件中,对剩余的列表元素求平均值,具体代码如下。avg_score=sum(scores)/len(scores)print("去掉一个最高分和一个最低分后的评委评分:",scores)print("该选手的最终得分为:%.2f"%avg_score)使用%.2f格式化输出选手的平均分并保留小数点后两位数字。【实验结果】该选手的最终得分为8.13分,去除了一个最高分和一个最低分,在剩下的3位评委的评分中取平均值,保留两位小数。【实验小结】本实验设计了模拟评分系统,涉及列表的创建、排序、删除指定元素等知识,还使用了除法算数运算符/求平均值。改进实验:还可以将评委的得分使用input()函数手动输入,并实现评分系统的多次使用。思考:利用所学知识,自己尝试还可以使用哪些方法去除最低分和最高分。图4-42文件Mock-judging.py的运行结果4.5Python元组在第2.2.2节已经学习了元组的含义及创建方法,元组也是一种序列,元组中元素不能被改变。本节主要对访问元组元素及元组的运算两方面进行讲解。4.5.1访问元组元素——索引访问元组和列表一样,既可以使用索引访问元组中的某个元素,得到一个元素的值,又可以使用切片访问元组中的一组元素,得到一个新的子元组。1.通过索引访问元组中的一个元素在tuple=(1,2,3,4,5,6,7,8)中,第4个元素为tuple[3],因为第4个元素也是倒数第5个元素,所以也可以通过tuple[-5]访问。如果指定下标不存在,则抛出异常。2.通过切片索引访问元组中的一组元素元组的切片也可以从元组中取得一组元素并组成一个新元组。下面通过一个示例演示元组切片的使用。在Chapter04中创建一个tuple01.py文件,具体代码如文件4-37所示。文件4-37tuple01.pytuple=('有情怀','有良心','有品质')print(tuple[0])tuple1=tuple[0:-1]print(tuple1)tuple2=tuple[1:]print(tuple2)在上述代码中,第2行代码通过索引访问元组中的一个元素,返回的是元组中的元素,即字符串类型的数据;第3、5行代码通过切片索引访问元组中的一组元素,返回的是元组数据。图4-43文件tuple01.py的运行结果元组与列表不同,元组不能通过下标索引修改元组中的元素,具体代码如下:tuple[0]='www/qfedu/com'上述语句运行时会报错,因为元组中的元素不能被修改。元组与列表相比的优点元组与列表相比的优点主要如下。速度更快元组的速度比列表快。如果定义了一系列常量值,而所做的操作仅仅是对它进行遍历,那么一般使用元组而不是列表。写保护安全元组对需要修改的数据进行写保护,这样将使得代码更加安全。可作字典键一些元组可用作字典键。3.访问元组元素——遍历元组元组的遍历方式和列表相同,包括while循环遍历、for循环直接遍历、range()函数索引遍历及enumerate()函数遍历。下面通过一个示例演示for循环遍历元组的方法。在Chapter04中创建一个tuple02.py文件,具体代码如文件4-38所示。文件4-38tuple02.pytuple=('有情怀','有良心','有品质')forxintuple:print(x)图4-44文件tuple02.py的运行结果由图4-44可知,使用for循环依次将元组中的元素赋值给x并通过print()函数输出,输出元组元素的数据类型,即字符串。4.5.2元组的运算元组与字符串一样,元组之间可以使用+、+=和*号进行运算,即元组可以组合和复制,运算后会生成一个新的元组。元组运算符如表4-12所示。表4-12元组运算符Python表达式结果描述len((1,2,3))3计算元素个数(1,2,3)+(4,5,6)(1,2,3,4,5,6)连接(("学习",)*4)('学习','学习','学习','学习')复制3in(1,2,3)True元素是否存在forxin(1,2,3):print(x,end="")123迭代元组——不可替代的原因与类型转换元组是不可替代的,有以下3方面的原因。可作字典键元组可以在字典中作为键使用,列表则不能作为字典中的键。访问速度快元组比列表访问和处理速度快。如果只需要访问元素,而不修改元素,建议使用元组。作为返回值元组可以作为很多内置函数和方法的返回值。另外,list()函数可以将元组转换为列表,而tuple()函数可以将列表转换为元组。4.6Python字典在第2.2.2节已经学习了字典的含义及创建方法,字典使用词-语义进行数据的构建,以键值对的形式,通过键可以快速找到对应的值。通过字典,可以方便地查找某个学生的成绩,并进行增加、删除、修改等操作。本节主要介绍Python访问字典、遍历字典、对字典进行操作、对字典元素进行操作、字典推导式及有序字典等方面进行介绍。4.6.1访问字典——通过键访问列表和元组是通过下标索引访问元素值,访问字典元素的值可以通过元素的键,也可以使用get()方法。下面通过一个示例演示通过键访问字典元素的方法。在Chapter04中创建一个dict01.py文件,创建一个字典,包含两个键,分别是水果和蔬菜,并访问对应的值,具体代码如文件4-39所示。文件4-39dict01.pydict={'水果':'苹果','蔬菜':'土豆'}print(dict['水果'])print(dict['蔬菜'])图4-45文件dict01.py的运行结果由图4-45可知,打印输出字典的键水果和蔬菜对应的值,分别是苹果和土豆。访问字典——get()方法不确定字典中是否存在某个键而又想访问该键对应的值时,可以使用get()方法,下面通过一个示例演示通过get()方法访问字典元素的方法。在Chapter04中创建一个dict02.py文件,创建一个字典,包含name、stu_id和grade等3个键。具体代码如文件4-40所示。文件4-40dict02.pystudent_dict={"name":"小千","stu_id":"202305","grade":"大四"}score_value=student_dict.get("score","此键不存在")print(score_value)在上述代码中,当字典中含有键"score"时,则返回与之对
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年云南省工会人员招聘考试备考试题及答案详解
- 2026年山西省忻州市工会人员招聘笔试模拟试题及答案详解
- 2026年济南市天桥区政务服务中心(窗口人员)招聘考试备考题库及答案详解
- 2026年邢台市桥东区政务服务中心(窗口人员)招聘笔试备考试题及答案详解
- 2026年柳州市柳南区医疗系统事业编人员招聘笔试备考题库及答案详解
- 2026中国国际货运航空股份有限公司维修工程师岗位社会招聘7人考试参考题库及答案详解
- 别急着下单:商城小程序模板的优缺点真实测评
- 先兆子痫题目与答案
- 2026年秋季贵州遵义市正安县尹珍实验学校考调教师28人笔试参考题库及答案详解
- 2026年惠州市惠城区工会人员招聘考试参考试题及答案详解
- 气象行业公共服务技能竞赛理论知识试题及答案
- GB/T 36699-2026锅炉用液体和气体燃料燃烧器技术规范
- 各部门、岗位人员及施工现场总分包安全生产责任制
- 平江2026年事业编招聘考试真题及答案解析
- (2026年)中小学阳光招生专项行动课件
- 2026四川安信科创科技有限公司第一批招聘12人笔试备考题库及答案解析
- 2026 年高考(江苏卷)地理试题及答案
- 2026年中国中铁招聘面试题库
- 质量保证体系及管理措施(完整的投标文件)
- 森林防火隔离带开设施工方案
- 《数字电子技术》课件-第8章 数模和模数转换
评论
0/150
提交评论