当前位置: 首页 > 后端技术 > Python

流畅的python学习笔记-第15章

时间:2023-03-26 19:28:23 Python

第15章上下文管理器和else块第15章上下文管理器和else块try..except..finallywith语句contextmanager@contextmanager装饰器try..except..finally看一个例子:defget_result():a=3b=0try:b=3/0exceptExceptase:print("ERROR=",e)finally:print("a=",a)if__name__=="__main__":get_result()返回结果为:ERROR=divisionbyzeroa=3总结:try..except..else没有捕获异常,执行else语句try..except..finally,不管是否捕获到异常,都执行finally语句与statement3读写python文本文件的方法#第一种方法:file1=open("test.txt")file2=open("output.txt","w")whileTrue:line=file1.readline()#这里可以进行逻辑处理file2.write(line)ifnotline:break#记住之后关闭文件就好了处理习惯file1.close()file2.close()#有3种读取文件的方法:#-read()将文本文件的所有行读入一个字符串。#-readline()逐行读取#-readlines()将文本文件中的所有行读入一个列表,文本文件的每一行都是列表的一个元素。#优点:readline()可以在读行时跳过特定行。#第二种方式:文件迭代器,使用for循环方式file2=open("output.txt","w")forlineinopen("test.txt"):#这里可以进行逻辑处理file2.write(line)#第三种方法:推荐使用此方法filecontextmanagerwithopen('somefile.txt','r')asf:data=f.read()withopen('somefile.txt','r')asf:forlineinf:print(line)withopen('somefile.txt','w')asf:f.write("hello")这里着重介绍第三种打开文件的方法在一些异常阅读和写作时可能会出现这种情况。如果按照常规的f.open写法,需要try,except,finally进行异常判断,而且无论文件发生什么情况,都必须执行finallyf.close()关闭文件,with方法最终帮助我们实现了f.close上下文管理器。上下文管理器协议包含两个方法:__enter__和__exit__。当with语句开始运行时,将在上下文管理器对象上调用__enter__方法。with语句完成运行后,它调用上下文管理器对象上的__exit__方法,充当finally子句。最常见的例子是确保文件对象是关闭的,exc_tb):print('T.__exit__')withT()ast:print(t)returnresult:T.__enter__我是__enter__的返回值T.__exit__with是给上下文管理器的,就像for是给上下文管理器与迭代器相同。with是为了方便上下文管理器的使用。@contextmanager装饰器上下文管理器不得不提@contextmanager装饰器,它可以减少创建上下文管理器的样板代码量,因为不需要写一个完整的类来定义__enter__和__exit__方法,只需要implement有一个带有yield语句的生成器,它会生成您希望__enter__方法返回的值。@contextmanager装饰器优雅而实用,结合了三个不同的Python特性:函数装饰器、生成器和with语句。在@contextmanager修饰的generator中,yield语句的作用是将函数的定义体分为两部分:1.yield语句之前的所有代码都在with块的开头执行(即when解释器调用__enter__方法)2.yield语句后面的代码在with块的末尾执行(即调用__exit__方法时)。示例:importsysimportcontextlib@contextlib.contextmanagerdefWoHa(n):original_write=sys.stdout.writedefreverse_write(text):original_write(text[::-1])sys.stdout.write=reverse_writeyieldnsys.stdout。write=original_writereturnTrueobj1=WoHa('你的手机被拿反了')以obj1为内容:print('哈哈镜花缘')print(content)print('####执行完成后,输出内容:####')print(content)返回结果:远花镜有哈哈,你拿着手机代替####with执行完成后,输出内容:####你的手机是把它倒过来。这里需要注意的是:当代码执行到yield时,会产生一个值,这个值会绑定到with语句中as子句的变量上。当执行with块中的代码时,函数将在yield处暂停。