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 上下文管理器,生成器,深拷贝,浅拷贝,正则表达式相关推荐

  1. python的上下文管理用哪个关键字_正确理解python中的关键字“with”与上下文管理器...

    正确理解python中的关键字"with"与上下文管理器 来源:中文源码网    浏览: 次    日期:2018年9月2日 [下载文档:  正确理解python中的关键字&quo ...

  2. 『SQL Server 2000 Reporting Services学习笔记』(1)报表管理器的使用 与 通过角色分配配置安全性...

    『SQL Server 2000 Reporting Services学习笔记』(1)报表管理器的使用 与 通过角色分配配置安全性 __________________________________ ...

  3. [转载] 玩转python中with的使用与上下文管理器

    参考链接: Python中的上下文管理器 人是随着时间不断进化而来的,同样编程语言也是随着IT行业的更新换代,功能模块不断地优化与丰富才壮大起来的.比如在python2.5之前使用open读写文件操作 ...

  4. python中with的用法,上下文管理器

    一.上下文管理器 含有__enter__和__exit__方法的对象就是上下文管理器 class Foo(object):def __init__(self):print('实例化一个对象')def ...

  5. 【金字塔Python量化学习笔记】01课:利用Python导出价格数据

    作为一个交易员,一直都想学Python量化,无奈文科生一个,根本不懂编程,看了vn.py的教程头大了,买了课但一直都学不下去.最近看了看金字塔的Python量化系统,感觉还可以,代码编写没那么难,我P ...

  6. python入门学习笔记——详细基础知识篇(第10章 正则表达式(重点)与JSON)

    第10章 正则表达式(重点)与JSON 初识正则表达式 元字符与普通字符 字符集 概括字符集 数量词 贪婪与非贪婪 匹配0次1次或者无限多次 边界匹配符(^ .$) 组 匹配模式参数 re.sub正则 ...

  7. SurvivalShooter学习笔记(八.敌人管理器)

    敌人管理器:管理敌人的随机出生点创建 在场景中建立几个空物体,作为敌人的出生点 public class EnemyManager : MonoBehaviour{public PlayerHealt ...

  8. python语言使用什么语句实现上下文管理协议_Python 技巧探究:上下文管理器和with语句...

    一:前言 Python 里面的 with 语句是被认为是晦涩难懂的特征之一,但是当你窥视它的内部你就会发现这里面并没有什么魔法.事实上它可以帮助我们写一些整洁和可读性高的代码. 那么 with 语句适 ...

  9. Python基础教程:上下文管理器 context manager(with...as...)

    一.概念 上下文管理器:就是实现了上下文管理协议的对象.主要用于保存和恢复各种全局状态,关闭文件等.上下文管理器本身是一种装饰器. 上下文允许可以自动的开始和结束一些和事情.例如当利用with-as打 ...

最新文章

  1. 程序员眼中的UML(2)--克服用例图的恐惧
  2. ORACLE表空间管理维护
  3. html5a链接_HTML 5 a 标签
  4. boost::heap模块实现可变堆的测试程序
  5. mysql buffer size_mysql中join_buffer_size的建议最大值是多少?
  6. linux修改services命令,Linux中service指令都有哪些参数
  7. 三分钟让你掌握JavaScript中值传递和引用传递的区别
  8. 微软 azure_Microsoft Azure,我们迁移数据的第一步
  9. python的数字类型有哪些子类型_PYTHON-基本数据类型-数字类型,字符串类型,列表类型-练习...
  10. hlg1492盒子【最小路径覆盖】
  11. screwing up
  12. 【Codeforces Round #516_div2_E】【二分交互题】Dwarves, Hats and Extrasensory Abilities
  13. python音乐播放器代码_Python简易音乐播放器
  14. python练手_opencv面部相似度标记
  15. 计算机视觉/图像处理领域相关研究机构梳理
  16. 带你领略python魔法~免费复制文档数据
  17. 马斯克被曝摆架子/ 朱晓彤卸任特斯拉中国法人/ 苹果M2Pro首发台积电3nm...今日更多新鲜事在此...
  18. 英孚教育全面上云与Serverless构建之路
  19. K8S、kubernetes no resolver defined to resolve could not be resolved (3: Host not found) 问题解决
  20. 上周技术关注:疯狂的社会性应用开发平台-NING

热门文章

  1. 怎样在excel中通过出生日期计算年龄
  2. Android 开机动画
  3. xiaopiu怎么导出html,xiaopiu原型工具
  4. Spring Boot 整合 阿里云短信(模板模式)
  5. STM32F4 | 独立看门狗(IWDG)实验
  6. 使用FPGA实现的图像锐化算法(USM)设计
  7. PON系统向单波速率25G演进
  8. iOS系统字体如何使用
  9. bert获得词向量_Bert输入输出是什么
  10. Maven的安装配置、IDEA中搭建Maven环境