python高级学习笔记Day04--01 上下文管理器,生成器,深拷贝,浅拷贝,正则表达式
with语句
简单又安全
with open('1.txt','w') as f:
f.write('hello,world')
上下文管理器
with语句之所以这么强大,背后是由上下文管理器做支撑的。
也就是说刚才使用open函数创建的f文件对象就是一个上下文管理器对象。
一个类只要实现了_enter_()和_exit_()_两个方法,通过该类创建的对象那个就称之为上下文管理器
案例:自定义上下文管理器类,模拟文件操作
class File(object):def __init__(self, file_name, file_model):self.file_name = file_nameself.file_model = file_modeldef __enter__(self):print('这是上文!')self.file = open(self.file_name, self.file_model)return self.filedef __exit__(self, exc_type, exc_val, exc_tb):self.file.close()print('这是下文')with File('1.txt', 'r') as f:data = f.read()print(data)
生成器
作用:根据程序设计者制定的规则循环生成数据,当条件不成立的时候则生成数据结束
数据不是一次性全部生成出来,而是使用一个,再生成一个,可以节约大量资源
两种创建方式:
生成器推导式:
data = [x for x in range(100)] # 列表推导式 print(data) data2 = (x for x in range(100)) # data2为生成器 print(data2) print(next(data2)) print(next(data2)) # next()函数获取生成器中的下一个值
yield关键字:
代码执行到yield会暂停,然后把结果返回出去,下一次启动生成器会在暂停的位置继续进行
生成器如果把数据生成完成后再次回去下一个数据会抛出一个StopIteration异常,for会自动处理
def mygennerator(n):for i in range(n):print('开始生成')yield iprint('生成结束')generator = mygennerator(5) # print(next(generator)) # print(next(generator)) # print(next(generator)) # print(next(generator)) # print(next(generator)) # print(next(generator)) # 报错 for i in generator: # 不报错print(i)
例子:佩波纳契数列
def fbgennerator(num):a = 0b = 1index = 0while index < num:index += 1# result = a# a, b = b, a + b# yield resultc = aa = bb = b + cyield cgenerator = fbgennerator(20) for i in generator:print(i)
浅拷贝,深拷贝
可变类型的浅拷贝
import copya = [1, 2, 3] b = [11, 54, 66] c = [a, b] d = c c_copy = copy.copy(c) print(id(c)) print(id(d)) # 数据与c相同,只是指向他的地址 print(id(c_copy)) # 数据与c不一样,浅拷贝会开辟新的空间把数据的第一层数据进行拷贝 print(a) print(id(c[0])) print(id(c_copy[0])) # 数值相同,浅拷贝深层数据指向原来地址,不安全,改变copy的内容也会影响 原来的数据
可变类型的深拷贝
import copya = [1, 2, 3] b = [11, 54, 66] c = [a, b] c_copy = copy.deepcopy(c) print(id(c)) print(id(c_copy)) # 数据与c不一样,深拷贝会开辟新的空间把第一层数据进行拷贝 print(id(c[0])) print(id(c_copy[0])) # 数值不相同,深拷贝会把深层数据分配新的空间进行拷贝存储,保证数据安全性
不可变类型的深,浅拷贝
不会开辟新的内存空间而只是拷贝了这个对象的引用
import copya = (1, 2, 3) b = (11, 54, 66) c = (a, b) c_copy = copy.copy(c) c_deepcopy=copy.deepcopy(c) print(id(c)) print(id(c_copy)) print(id(c_deepcopy)) #三个id相同
正则表达式
作用:查找符合某些复杂规则的字符串
例:0/d{2}-/d{8} , 匹配座机号码(0+ 两个0到9的数字 + - +八个0到9的数字)
re模块
import restr = 'asd' result = re.match(str, 'asdadidas054188844ssssasddddd') print(result.group())
匹配单个字符
代码:
import restr = 'AaA12 _ aaaA3B!#我哈哈' result = re.findall('\w', str) print(result, '匹配数字字母汉字下划线') result = re.findall('\W', str) print(result, '匹配非数字字母汉字下划线') result = re.findall('[\d]', str) print(result, '匹配任意数字') result = re.findall('\D', str) print(result, '匹配非数字') result = re.findall('[1,A,B,a]', str) print(result, '匹配括号内任一字符') result = re.findall('\s', str) print(result, '匹配空白') result = re.findall('\S', str) print(result, '匹配非空白') result = re.findall('.', str) print(result, '匹配任意字符除\n')
匹配多个字符
代码
import restr = 'AaA12 _ AaaaA3B!A44444#我哈哈'result = re.findall('Aa*', str) print(result, '匹配A跟上0到无限个a') result = re.findall('A\d*', str) print(result, '匹配A跟上0到无限个数字') result = re.findall('A\d+', str) print(result, '匹配A跟上至少一个数字') result = re.findall('A\d?', str) print(result, '匹配A跟上1个或0个数字') result = re.findall('Aa{3}', str) print(result, '匹配A跟上3个a') result = re.findall('A\d{1,3}', str) print(result, '匹配A跟上1到3个数字') result = re.findall('A\d{2,}', str) print(result, '匹配A跟上至少2个数字')
匹配开头结尾
代码:
import restr = 'AaA12 _ AaaaA3B!A44444#我哈哈8'result = re.findall('^\w.*', str) print(result, '以汉字字母数字下划线开头') result = re.findall('.*\d$', str) print(result, '以数字结尾') result = re.findall('[^A]', str) print(result, '不是括号里的字符') result = re.findall('.*[^8]$', str) print(result, '不以8为结尾的字符串')
匹配分组
例一:在列表中匹配 |的使用
import relist1 = ['apple', 'banana', 'watermelon', 'orange', 'pear'] for i in list1:result = re.findall('apple|pear', i)if result:print(result)
例二:匹配出邮箱 分组和转义字符
import reresult = re.match('[a-zA-Z0-9_]{4,20}@(163|126|qq)\.com', 'hello@163.com') print(result.group())
例三:匹配qq号码 ()分组
import reresult = re.match('(qq):([1-9]\d{4,11})', 'qq:115648哈哈哈') print(result.group()) print(result.group(1)) print(result.group(2))
例四: 分组过后想要再次使用定义的第一个分组\\1即可
import re result = re.match('<([a-zA-Z1-6]{4})>.*</\\1>', '<html>content</html>4476') print(result.group())
例五: 分组取别名
import reresult = re.match('<(?P<html>[a-zA-Z1-6]{4})>.*</(?P=html)>', '<html>content</html>4476') print(result.group())
python高级学习笔记Day04--01 上下文管理器,生成器,深拷贝,浅拷贝,正则表达式相关推荐
- python的上下文管理用哪个关键字_正确理解python中的关键字“with”与上下文管理器...
正确理解python中的关键字"with"与上下文管理器 来源:中文源码网 浏览: 次 日期:2018年9月2日 [下载文档: 正确理解python中的关键字&quo ...
- 『SQL Server 2000 Reporting Services学习笔记』(1)报表管理器的使用 与 通过角色分配配置安全性...
『SQL Server 2000 Reporting Services学习笔记』(1)报表管理器的使用 与 通过角色分配配置安全性 __________________________________ ...
- [转载] 玩转python中with的使用与上下文管理器
参考链接: Python中的上下文管理器 人是随着时间不断进化而来的,同样编程语言也是随着IT行业的更新换代,功能模块不断地优化与丰富才壮大起来的.比如在python2.5之前使用open读写文件操作 ...
- python中with的用法,上下文管理器
一.上下文管理器 含有__enter__和__exit__方法的对象就是上下文管理器 class Foo(object):def __init__(self):print('实例化一个对象')def ...
- 【金字塔Python量化学习笔记】01课:利用Python导出价格数据
作为一个交易员,一直都想学Python量化,无奈文科生一个,根本不懂编程,看了vn.py的教程头大了,买了课但一直都学不下去.最近看了看金字塔的Python量化系统,感觉还可以,代码编写没那么难,我P ...
- python入门学习笔记——详细基础知识篇(第10章 正则表达式(重点)与JSON)
第10章 正则表达式(重点)与JSON 初识正则表达式 元字符与普通字符 字符集 概括字符集 数量词 贪婪与非贪婪 匹配0次1次或者无限多次 边界匹配符(^ .$) 组 匹配模式参数 re.sub正则 ...
- SurvivalShooter学习笔记(八.敌人管理器)
敌人管理器:管理敌人的随机出生点创建 在场景中建立几个空物体,作为敌人的出生点 public class EnemyManager : MonoBehaviour{public PlayerHealt ...
- python语言使用什么语句实现上下文管理协议_Python 技巧探究:上下文管理器和with语句...
一:前言 Python 里面的 with 语句是被认为是晦涩难懂的特征之一,但是当你窥视它的内部你就会发现这里面并没有什么魔法.事实上它可以帮助我们写一些整洁和可读性高的代码. 那么 with 语句适 ...
- Python基础教程:上下文管理器 context manager(with...as...)
一.概念 上下文管理器:就是实现了上下文管理协议的对象.主要用于保存和恢复各种全局状态,关闭文件等.上下文管理器本身是一种装饰器. 上下文允许可以自动的开始和结束一些和事情.例如当利用with-as打 ...
最新文章
- 程序员眼中的UML(2)--克服用例图的恐惧
- ORACLE表空间管理维护
- html5a链接_HTML 5 a 标签
- boost::heap模块实现可变堆的测试程序
- mysql buffer size_mysql中join_buffer_size的建议最大值是多少?
- linux修改services命令,Linux中service指令都有哪些参数
- 三分钟让你掌握JavaScript中值传递和引用传递的区别
- 微软 azure_Microsoft Azure,我们迁移数据的第一步
- python的数字类型有哪些子类型_PYTHON-基本数据类型-数字类型,字符串类型,列表类型-练习...
- hlg1492盒子【最小路径覆盖】
- screwing up
- 【Codeforces Round #516_div2_E】【二分交互题】Dwarves, Hats and Extrasensory Abilities
- python音乐播放器代码_Python简易音乐播放器
- python练手_opencv面部相似度标记
- 计算机视觉/图像处理领域相关研究机构梳理
- 带你领略python魔法~免费复制文档数据
- 马斯克被曝摆架子/ 朱晓彤卸任特斯拉中国法人/ 苹果M2Pro首发台积电3nm...今日更多新鲜事在此...
- 英孚教育全面上云与Serverless构建之路
- K8S、kubernetes no resolver defined to resolve could not be resolved (3: Host not found) 问题解决
- 上周技术关注:疯狂的社会性应用开发平台-NING