一、if 语句之外的 else块

  else 子句不仅能在 if 语句中使用,还能在for、while和try语句中使用。

  (1)for :仅当 for 循环运行完毕时(即 for 循环没有被break语句中止)才运行else 块,

  (2)while :仅当 while 循环因为条件为False 而退出时(即 while 循环没有被break语句中止)才运行else 块

  (3)try :仅当 try 块中没有异常抛出时才运行 else 块。else子句抛出的异常不会由前面的except子句处理。

▲ 在所有情况下,如果异常或者return、break或continue语句导致控制权跳到了复合语句的主块之外,else语句也会被跳过。

二、上下文管理器和 with 块

上下文管理器对象存在的目的是管理with语句,就像迭代器的存在是为了管理for语句一样。

with 语句的目的是简化 try/finally 模式。

这种模式用于保证一段代码运行完毕后执行某项操作,即便那段代码由于异常、return语句或sys.exit() 调用而中止,也会执行指定的操作。

finally 子句中代码通常用于释放重要的资源,或者还原临时变更的转态。

上下文管理器协议包含 __enter__ 和 __exit__ 两个方法。

with语句开始运行时,会在上下文管理器对象上调用__enter__方法。

with语句结束运行时,会在上下文管理器对象上调用__exit__ 方法,以此扮演finally子句的角色。

▲ 与函数的模块不同,with块没有定义新的作用域。

上下文管理器类代码:

class LookingGlass:

    def __enter__(self):
import sys
self.original_write = sys.stdout.write
sys.stdout.write = self.reverse_write
return 'ABCDEFGHIJK' def reverse_write(self,text):
self.original_write(text[::-1]) def __exit__(self, exc_type, exc_val, exc_tb):
import sys
sys.stdout.write = self.original_write
if exc_type is ZeroDivisionError:
print('Please Do not divide by zero')
return True with LookingGlass() as what:
print('Alice,Kitty and Snowdrop')
print(what) # pordwonS dna yttiK,ecilA
# KJIHGFEDCBA

__enter__方法返回的对象,存放在with语句的 as xxx对象中。

如果__exit__方法返回None,或者True之外的值,with块中的任何异常都会向上冒泡。

传给__exit__方法的三个参数列举:exc_type:异常类;exc_value:异常实例;traceback:traceback对象

三、使用 @contextmanager

@contextmanager 装饰器能减少创建上下文管理器的样板代码量;

因为不用编写一个完整的类,定义__enter__和__exit__方法,而只需实现有一个yield 语句的生成器,生成想让__enter__方法返回的值。

在使用@contextmanager 装饰的生成器中,yield语句作用是把函数的定义体分成两部分:

yield语句前面的所有代码在with块开始时执行,yield语句后面的代码在with块结束时执行。

import contextlib

@contextlib.contextmanager
def looking_glass(): import sys
original_write = sys.stdout.write def reverse_write(text):
original_write(text[::-1]) sys.stdout.write = reverse_write
yield 'ABCDEFGHIJK'
sys.stdout.write = original_write with looking_glass() as what:
print('Alice,Kitty and Snowdrop')
print(what) # pordwonS dna yttiK,ecilA
# KJIHGFEDCBA

▲ 如果在with块中抛出异常,Python解释器会将其捕获,然后在yield表达式里再次抛出。需要在此处处理异常。

@contextlib.contextmanager
def looking_glass(): import sys
original_write = sys.stdout.write def reverse_write(text):
original_write(text[::-1]) sys.stdout.write = reverse_write msg = ''
try:
yield 'ABCDEFGHIJK'
except ZeroDivisionError:
msg = 'Please Do not divide by zero'
finally:
sys.stdout.write = original_write
if msg:
print(msg)

▲ 使用@contextmanager 装饰器时,要把yield语句放在 try/finally 语句中,或者放在with语句中。

上下文管理器和else块的更多相关文章

  1. Python 上下文管理器和else块

    最终,上下文管理器可能几乎与子程序(subroutine)本身一样重要.目前,我们只了解了上下文管理器的皮毛--Basic 语言有with 语句,而且很多语言都有.但是,在各种语言中 with 语句的 ...

  2. 第15章 上下文管理器和else块

    #<流流畅的Python>第15章 上下文管理器和else块 #15.1 先做这个,再做那个:if语句之外的else块 #else子句不仅能在if语句中使用,还能在for.while和tr ...

  3. 流畅的python第十五章上下文管理器和else块学习记录

    with 语句和上下文管理器for.while 和 try 语句的 else 子句 with 语句会设置一个临时的上下文,交给上下文管理器对象控制,并且负责清理上下文.这么做能避免错误并减少样板代码, ...

  4. 『流畅的Python』第15章:上下文管理器和else块

  5. 【Python】【上下文管理器】

    """#[备注]#1⃣️try :仅当try块中没有异常抛出时才运行else块.#2⃣️for:仅当for循环运行完毕(即for循环没有被break语句终止)才运行els ...

  6. python2.7高级编程 笔记一(Python中的with语句与上下文管理器学习总结)

    0.关于上下文管理器上下文管理器是可以在with语句中使用,拥有__enter__和__exit__方法的对象. with manager as var: do_something(var) 相当于以 ...

  7. 【Python学习笔记】with语句与上下文管理器

    with语句 上下文管理器 contextlib模块 参考引用 with语句 with语句时在Python2.6中出现的新语句.在Python2.6以前,要正确的处理涉及到异常的资源管理时,需要使用t ...

  8. python上下文管理器及with语句

    with语句支持在一个叫上下文管理器的对象的控制下执行一系列语句,语法大概如下: with context as var: statements 其中的context必须是个上下文管理器,它实现了两个 ...

  9. 流畅python学习笔记:第十五章:上下文管理器

    在开始本章之前,我们首先来谈谈try-excep..final模块.在Python中,进行异常保护的最多就是用try..except..final.首先来看下下面的代码.进行一个简单的除法运算.为了防 ...

随机推荐

  1. Mac终端 bash和zsh切换方法

    切换到bash chsh -s /bin/bash 切换到zsh chsh -s /bin/zsh 终端重启后生效

  2. 2019年08月21日 服务部署笔记 请求打不到域名后某个pod上

    背景: 一个小项目http+https的小项目, 需要配置域名, 因http 和 https服务共存, 所以决定域名后面挂两个不同的LVS, 80端口一个, 443端口一个. 服务框架: nginx服 ...

  3. ubuntu18安装PacketTracer-7.2.2

    1.下载需要先注册个账号 https://www.netacad.com/zh-hans/courses/packet-tracer  2.运行.run文件 chmod +x PacketTracer ...

  4. 洛谷P2178 [NOI2015]品酒大会 后缀数组+单调栈

    P2178 [NOI2015]品酒大会 题目链接 https://www.luogu.org/problemnew/show/P2178 题目描述 一年一度的"幻影阁夏日品酒大会" ...

  5. python中int是什么类型

    python中的基本数据类型 1:虽然python中的变量不需要声明,但使用时必须赋值整形变量浮点型变量字符型2:可以一个给多个变量赋值,也可以多个给多个变量赋值3:python3中有6个标准数据类型 ...

  6. 【Python基础】02_Python中变量的输入输出

    1.变量的输入: input函数: input() input("请输入银行卡密码") password = input("请输入银行卡密码") 变量名 = i ...

  7. Go入门所踩过的坑:cannot find package "" in any of

    问题:cannot find package "" in any of.现已按照博客解决,分享一种自己踩得坑欢迎大神指导交流! 首先使用go env查看当前环境变量,新手入门出现找 ...

  8. [Tarjan系列] 无向图e-DCC和v-DCC的缩点

    上一篇讲了如何应用Tarjan算法求出e-DCC和v-DCC. 那么这一篇就是e-DCC和v-DCC的应用之一:缩点. 先讲e-DCC的缩点. 我们把每一个e-DCC都看成一个节点,把所有桥边(x,y ...

  9. 轻松搭建CAS 5.x系列(1)-使用cas overlay搭建SSO SERVER服务端

    概要说明 cas的服务端搭建有两种常用的方式:   1. 基于源码的基础上构建出来的   2. 使用WAR overlay的方式来安装 官方推荐使用第二种,配置管理方便,以后升级也容易.本文就是使用第 ...

  10. SIP协议入门:初学者必须明白的几个重要概念

    SIP协议初学者必须明白的几个重要概念 http://blog.sina.com.cn/s/blog_60e1d7bb0100f6er.html 一. SIP协议的分层结构 SIP是一个分层结构协议, ...