毕业答辩企业网站开发的问题最热门网页游戏排行榜
2026/1/9 10:48:01 网站建设 项目流程
毕业答辩企业网站开发的问题,最热门网页游戏排行榜,企业网站建设费用 珠海,ps做网站需注意什么学习目标 1、能够掌握with语句的使用 2、能够知道生成器的两种创建方式 3、能够知道深拷贝和浅拷贝的区别 4、能够掌握Python中的正则表达式编写 一、Python高级语法 1、with语句和上下文管理器 ☆ with语句 Python提供了 with 语句的写法#xff0c;既简单又安全。 文件操作的…学习目标1、能够掌握with语句的使用2、能够知道生成器的两种创建方式3、能够知道深拷贝和浅拷贝的区别4、能够掌握Python中的正则表达式编写一、Python高级语法1、with语句和上下文管理器☆ with语句Python提供了 with 语句的写法既简单又安全。文件操作的时候使用with语句可以自动调用关闭文件操作即使出现异常也会自动关闭文件操作。举个栗子使用with方法实现文件操作如下所示# 1、以写的方式打开文件withopen(1.txt,w)asf:# 2、读取文件内容f.write(hello world)2、生成器的创建方式根据程序设计者制定的规则循环生成数据当条件不成立时则生成数据结束数据不是一次性全部生成出来而是使用一个再生成一个可以节约大量的内存。创建生成器的方式① 生成器推导式② yield 关键字☆ 生成器推导式与列表推导式类似只不过生成器推导式使用小括号。# 创建生成器my_generator(i*2foriinrange(5))print(my_generator)# next获取生成器下一个值# value next(my_generator)# print(value)# 遍历生成器forvalueinmy_generator:print(value)生成器相关函数next 函数获取生成器中的下一个值for循环遍历生成器中的每一个值☆ yield生成器yield 关键字生成器的特征在def函数中具有yield关键字defgenerator(n):foriinrange(n):print(开始生成...)yieldiprint(完成一次...)ggenerator(5)print(next(g))print(next(g))print(next(g))print(next(g))print(next(g))-----正常print(next(g))-----报错 Traceback(most recent call last):File/Users/cndws/PycharmProjects/pythonProject/demo.py,line14,inmoduleprint(next(g))StopIterationdefgenerator(n):foriinrange(n):print(开始生成...)yieldiprint(完成一次...)ggenerator(5)foriing:print(i)defgenerator(n):foriinrange(n):print(开始生成...)yieldiprint(完成一次...)ggenerator(5)whileTrue:try:print(next(g))exceptStopIteration:break注意点① 代码执行到 yield 会暂停然后把结果返回出去下次启动生成器会在暂停的位置继续往下执行② 生成器如果把数据生成完成再次获取生成器中的下一个数据会抛出一个StopIteration 异常表示停止迭代异常③ while 循环内部没有处理异常操作需要手动添加处理异常操作④ for 循环内部自动处理了停止迭代异常使用起来更加方便推荐大家使用。☆ yield关键字和return关键字如果不太好理解yield可以先把yield当作return的同胞兄弟来看他们都在函数中使用并履行着返回某种结果的职责。这两者的区别是有return的函数直接返回所有结果程序终止不再运行并销毁局部变量defexample():x1returnx exampleexample()print(example)而有yield的函数则返回一个可迭代的 generator生成器对象你可以使用for循环或者调用next()方法遍历生成器对象来提取结果。defexample():x1y10whilexy:yieldx x1exampleexample()print(example)☆ 为什么要使用yield生成器importmemory_profilerasmem# nums [1, 2, 3, 4, 5]# print([i*i for i in nums])numslist(range(10000000))print(运算前内存,mem.memory_usage())# 列表# square_nums [n * n for n in nums]# 生成器square_nums(n*nforninnums)print(运算后内存,mem.memory_usage())☆ yield与斐波那契数列数学中有个著名的斐波拉契数列Fibonacci要求数列中第一个数为0第二个数为1其后的每一个数都可由前两个数相加得到例子1, 1, 2, 3, 5, 8, 13, 21, 34, …现在我们使用生成器来实现这个斐波那契数列每次取值都通过算法来生成下一个数据,生成器每次调用只生成一个数据可以节省大量的内存。deffib(max):n,a,b0,0,1whilenmax:yieldb# 使用 yield# print ba,bb,ab nn1forninfib(5):printn3、深浅拷贝☆ 几个概念变量是一个系统表的元素拥有指向对象的连接空间对象被分配的一块内存存储其所代表的值引用是自动形成的从变量到对象的指针类型属于对象而非变量不可变对象一旦创建就不可修改的对象包括数值类型、字符串、布尔类型、元组该对象所指向的内存中的值不能被改变。当改变某个变量时候由于其所指的值不能被改变相当于把原来的值复制一份后再改变这会开辟一个新的地址变量再指向这个新的地址。可变对象可以修改的对象包括列表、字典、集合该对象所指向的内存中的值可以被改变。变量准确的说是引用改变后实际上是其所指的值直接发生改变并没有发生复制行为也没有开辟新的地址通俗点说就是原地改变。当我们写apythonPython解释器干的事情① 创建变量a② 创建一个对象(分配一块内存)来存储值 ‘python’③ 将变量与对象通过指针连接起来从变量到对象的连接称之为引用(变量引用对象)☆ 赋值赋值: 只是复制了新对象的引用不会开辟新的内存空间。并不会产生一个独立的对象单独存在只是将原有的数据块打上一个新标签所以当其中一个标签被改变的时候数据块就会发生变化另一个标签也会随之改变。☆ 浅拷贝浅拷贝: 创建新对象其内容是原对象的引用。浅拷贝之所以称为浅拷贝是它仅仅只拷贝了一层拷贝了最外围的对象本身内部的元素都只是拷贝了一个引用而已。案例1赋值案例2可变类型浅拷贝案例3不可变类型浅拷贝注不可变类型进行浅拷贝不会给拷贝的对象开辟新的内存空间而只是拷贝了这个对象的引用浅拷贝有三种形式 切片操作工厂函数copy模块中的copy函数。如 lst [1,2,[3,4]]切片操作lst1 lst[:] 或者 lst1 [each for each in lst]注[:]它与[0:]相似意思是从0索引拆分到末尾。它返回一个新列表。工厂函数lst1 list(lst)copy函数lst1 copy.copy(lst)但是在lst中有一个嵌套的list[3,4]如果我们修改了它情况就不一样了。浅复制要分两种情况进行讨论1当浅复制的值是不可变对象字符串、元组、数值类型时和“赋值”的情况一样对象的id值*id()函数用于获取对象的内存地址*与浅复制原来的值相同。2当浅复制的值是可变对象列表、字典、集合时会产生一个“不是那么独立的对象”存在。有两种情况第一种情况复制的对象中无复杂子对象原来值的改变并不会影响浅复制的值同时浅复制的值改变也并不会影响原来的值。原来值的id值与浅复制原来的值不同。第二种情况复制的对象中有复杂子对象例如列表中的一个子元素是一个列表如果不改变其中复杂子对象浅复制的值改变并不会影响原来的值。 但是改变原来的值中的复杂子对象的值会影响浅复制的值。☆ 深拷贝深拷贝和浅拷贝对应深拷贝拷贝了对象的所有元素包括多层嵌套的元素。深拷贝出来的对象是一个全新的对象不再与原来的对象有任何关联。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。只有一种形式copy模块中的deepcopy函数。可变类型深拷贝不可变类型深拷贝不可变类型进行深拷贝不会给拷贝的对象开辟新的内存空间而只是拷贝了这个对象的引用☆ 案例演示案例1对于可变对象深浅拷贝importcopy a[1,2,3]print(赋值)baprint(a)print(b)print(id(a))print(id(b))print(浅拷贝)bcopy.copy(a)print(a)print(b)print(id(a))print(id(b))print(深拷贝)bcopy.deepcopy(a)print(a)print(b)print(id(a))print(id(b))结果赋值[1,2,3][1,2,3]3723514437235144浅拷贝[1,2,3][1,2,3]3723514437191432深拷贝[1,2,3][1,2,3]3723514437210184小结赋值 值相等地址相等copy浅拷贝值相等地址不相等deepcopy深拷贝值相等地址不相等案例2对于可变对象深浅拷贝外层改变元素importcopy l[1,2,3,[4,5]]l1l#赋值l2copy.copy(l)#浅拷贝l3copy.deepcopy(l)#深拷贝l.append(6)print(l)print(l1)print(l2)print(l3)结果[1,2,3,[4,5],6]#l添加一个元素6[1,2,3,[4,5],6]#l1跟着添加一个元素6[1,2,3,[4,5]]#l2保持不变[1,2,3,[4,5]]#l3保持不变案例3对于可变对象深浅拷贝内层改变元素importcopy l[1,2,3,[4,5]]l1l#赋值l2copy.copy(l)#浅拷贝l3copy.deepcopy(l)#深拷贝l[3].append(6)print(l)print(l1)print(l2)print(l3)结果[1,2,3,[4,5,6]]#l[3]添加一个元素6[1,2,3,[4,5,6]]#l1跟着添加一个元素6[1,2,3,[4,5,6]]#l2跟着添加一个元素6[1,2,3,[4,5]]#l3保持不变小结① 外层添加元素时浅拷贝不会随原列表变化而变化内层添加元素时浅拷贝才会变化。② 无论原列表如何变化深拷贝都保持不变。③ 赋值对象随着原列表一起变化。二、正则表达式概述1、为什么要学习正则表达式在实际开发过程中经常会有查找符合某些复杂规则的字符串的需要比如邮箱、图片地址、手机号码等这时候想匹配或者查找符合某些规则的字符串就可以使用正则表达式了2、什么是正则表达式正则表达式(regular expression)描述了一种字符串匹配的模式可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。模式一种特定的字符串模式这个模式是通过一些特殊的符号组成的。某种也可以理解为是一种模糊匹配。精准匹配select * from blog where title‘python’;模糊匹配select * from blog where title like ‘%python%’;正则表达式并不是Python所特有的在Java、PHP、Go以及JavaScript等语言中都是支持正则表达式的。3、正则表达式的功能① 数据验证表单验证、如手机、邮箱、IP地址② 数据检索数据检索、数据抓取③ 数据隐藏135****6235 王先生④ 数据过滤论坛敏感关键词过滤…二、re模块的介绍1、什么是re模块在Python中需要通过正则表达式对字符串进行匹配的时候可以使用一个re模块2、re模块使用三步走# 第一步导入re模块importre# 第二步使用match方法进行匹配操作resultre.match(pattern正则表达式,string要匹配的字符串,flags0)# 第三步如果数据匹配成功使用group方法来提取数据result.group()match函数参数说明参数描述pattern匹配的正则表达式string要匹配的字符串。flags标志位用于控制正则表达式的匹配方式如是否区分大小写多行匹配等等。参见正则表达式修饰符 - 可选标志匹配成功re.match方法返回一个匹配的对象否则返回None。我们可以使用group(num) 或 groups() 匹配对象函数来获取匹配数据。正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。多个标志可以通过按位 OR(|) 它们来指定。如 re.I | re.M 被设置成 I 和 M 标志修饰符描述re.I使匹配对大小写不敏感re.L做本地化识别locale-aware匹配这个功能是为了支持多语言版本的字符集使用环境的比如在转义符\w在英文环境下它代表[a-zA-Z0-9_]即所以英文字符和数字。如果在一个法语环境下使用缺省设置下不能匹配é 或 “ç”。加上这L选项和就可以匹配了。不过这个对于中文环境似乎没有什么用它仍然不能匹配中文字符。re.M多行匹配影响 ^ 和 $re.S使 . 匹配包括换行在内的所有字符re.U根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B.re.XVERBOSE冗余模式 此模式忽略正则表达式中的空白和#号的注释例如写一个匹配邮箱的正则表达式。该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。3、re模块的相关方法☆ re.match(pattern, string, flags0)从字符串的起始位置匹配如果匹配成功则返回匹配内容 否则返回None☆ re.findall(pattern, string, flags0)扫描整个串返回所有与pattern匹配的列表注意: 如果pattern中有分组则返回与分组匹配的列表举例re.findall(\d,chuan1zhi2) [1,2]☆ re.finditer(pattern, string, flags)功能与上面findall一样不过返回的时迭代器参数说明pattern : 模式字符串。repl : 替换的字符串也可为一个函数。string : 要被查找替换的原始字符串。count : 模式匹配后替换的最大次数默认 0 表示替换所有的匹配。flags: 匹配方式:re.I 使匹配对大小写不敏感I代表Ignore忽略大小写re.S 使 . 匹配包括换行在内的所有字符re.M 多行模式,会影响^,$4、正则表达式快速入门案例1查找一个字符串中是否具有数字“8”importre resultre.findall(8,13566128753)# print(result)ifresult:print(result)else:print(未匹配到任何数据)案例2查找一个字符串中是否具有数字importre resultre.findall(\d,a1b2c3d4f5)# print(result)ifresult:print(result)else:print(未匹配到任何数据)案例3查找一个字符串中是否具有非数字importre resultre.findall(\D,a1b2c3d4f5)# print(result)ifresult:print(result)else:print(未匹配到任何数据)三、正则表达式详解正则编写三步走查什么、查多少、从哪查1、查什么代码功能.英文点号匹配任意1个字符除了\n[ ]匹配[ ]中列举的某个字符专业名词 字符簇[^指定字符]匹配除了指定字符以外的其他某个字符^专业名词 托字节\d匹配数字即0-9\D匹配非数字即不是数字\s匹配空白即 空格tab键\S匹配非空白\w匹配非特殊字符即a-z、A-Z、0-9、_\W匹配特殊字符即非字母、非数字、非下划线字符簇常见写法① [abcdefg] 代表匹配abcdefg字符中的任意某个字符1个② [aeiou] 代表匹配a、e、i、o、u五个字符中的任意某个字符③ [a-z] 代表匹配a-z之间26个字符中的任意某个④ [A-Z] 代表匹配A-Z之间26个字符中的任意某个⑤ [0-9] 代表匹配0-9之间10个字符中的任意某个⑥ [0-9a-zA-Z] 代表匹配0-9之间、a-z之间、A-Z之间的任意某个字符字符簇 托字节结合代表取反的含义① [^aeiou] 代表匹配除了a、e、i、o、u以外的任意某个字符② [^a-z] 代表匹配除了a-z以外的任意某个字符\d 等价于 [0-9] 代表匹配0-9之间的任意数字\D 等价于 [^0-9]代表匹配非数字字符只能匹配1个2、查多少代码功能*匹配前一个字符出现0次或者无限次即可有可无0到多匹配前一个字符出现1次或者无限次即至少有1次1到多?匹配前一个字符出现1次或者0次即要么有1次要么没有0或1{m}匹配前一个字符出现m次匹配手机号码\d{11}{m,}匹配前一个字符至少出现m次\w{3,}代表前面这个字符最少要出现3次最多可以是无限次{m,n}匹配前一个字符出现从m到n次\w{6,10}代表前面这个字符出现6到10次基本语法正则匹配字符.或\w或\S 跟查多少如\w{6, 10}如.*匹配前面的字符出现0次或多次3、从哪查代码功能^匹配以某个字符串开头$匹配以某个字符串结尾扩展正则工具箱http://jsrun.net/app/reghttp://tools.jb51.net/regex/create_reghttp://www.dycan.cn/Tools/js_expression/?randd899032e86733fc430b087ebd5da1815四、几个重要概念作用re.match(‘src“(.*)”’, str)src“./images/1.jpg”分组获取的结果捕获 ./images/1.jpg1、子表达式又称之为分组在正则表达式中通过一对圆括号括起来的内容我们就称之为子表达式。re.search(r\d(\d)(\d),abcdef123ghijklmn)注意Python正则表达式前的 r 表示原生字符串rawstring该字符串声明了引号中的内容表示该内容的原始含义避免了多次转义造成的反斜杠困扰。正则表达式中\d\d\d中(\d)(\d)就是子表达式一共有两个()圆括号则代表两个子表达式说明findall方法如果pattern中有分组则返回与分组匹配的列表所以分组操作中不适合使用findall方法建议使用search(匹配一个)或finditer(匹配多个)方法。2、捕获当正则表达式在字符串中匹配到相应的内容后计算机系统会自动把子表达式所匹配的到内容放入到系统的对应缓存区中缓存区从$1开始案例演示importre# 匹配字符串中连续出现的两个相同的单词str1abcdef123ghijklmnresultre.search(r\d(\d)(\d),str1)print(result.group())print(result.group(1))print(result.group(2))3、反向引用后向引用在正则表达式中我们可以通过\nn代表第n个缓存区的编号来引用缓存区中的内容我们把这个过程就称之为反向引用。① 连续4个数字re.search(r’\d\d\d\d, str1)1234、5678、6789② 连续的4个数字但是数字的格式为1111、2222、3333、4444、5555效果re.search(r’(\d)\1\1\1, str1)4、几个练习题① 查找连续的四个数字如3569答\d\d\d\d或\d{4}② 查找连续的相同的四个数字如1111答(\d)\1\1\1③ 查找数字如1221,3443答(\d)(\d)\2\1第一个()放入1号缓冲区如果想引用\1第二个()放入2号缓冲区如果想引用\2④ 查找字符如AABB,TTMM提示A-Z正则[A-Z]答([A-Z])\1([A-Z])\2⑤ 查找连续相同的四个数字或四个字符提示\w答(\w)\1\1\11111aaaabbbb五、正则表达式其他方法1、选择匹配符|可以匹配多个规则案例匹配字符串hellojava或hellopythonimportrestrhellojava, hellopythonresultre.finditer(rhello(java|python),str)ifresult:foriinresult:print(i.group())else:print(未匹配到任何数据)2、分组别名代码功能(?P)分组起别名(?Pname)引用别名为name分组匹配到的字符串案例匹配book/book# 导入模块importre str1book/bookresultre.search(r(?Pmark\w)/(?Pmark),str1)print(result.group())3、综合案例①需求在列表中[“apple”, “banana”, “orange”, “pear”]匹配apple和pearimportre list1[apple,banana,orange,pear]str1str(list1)resultre.finditer((apple|pear),str1)ifresult:foriinresult:print(i.group())else:print(未匹配到任何数据)② 需求匹配出163、126、qq等邮箱importre email1478670qq.com, go126.com, heima123163.comresultre.finditer(\w(qq|126|163).com,email)ifresult:foriinresult:print(i.group())else:print(未匹配到任何数据)③需求 : 匹配qq:10567这样的数据提取出来qq文字和qq号码importre str1qq:10567resultre.split(r:,str1)ifresult:print(f{result[0]}号{result[1]})else:print(未匹配到任何数据)④需求匹配出hh⑤需求匹配出www.itcast.cn⑥需求匹配出www.itcast.cn

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询