else 与 with 语句

with语句,一种与异常处理相关的功能
with语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等

with open('students.txt', 'r') as fileReader:
    for row in fileReader:
        print(row.strip())
        
可见Python的with语句是提供一个有效的机制,让代码更简练,同时在异常产生时,清理工作更简单。

with的表达式一般是这样的

```python
1 with EXPR as VAR:
2 
3     BLOCK

其中EXPR可以是任意表达式;as VAR是可选的。其一般的执行过程是这样的:

执行EXPR,生成上下文管理器context_manager;
获取上下文管理器的__exit()__ 方法,并保存起来用于之后的调用;
调用上下文管理器的__enter__()方法;如果使用了as子句,则将__enter__()方法的返回值赋值给as子句中的VAR;
执行BLOCK中的表达式;
不管是否执行过程中是否发生了异常,执行上下文管理器的__exit__()方法,exit()方法负责执行“清理”工作,如释放资源等。如果执行过程中没有出现异常,或者语句体中执行了语句break/continue/return,则以None作为参数调用__exit__(None, None, None);如果执行过程中出现异常,则使用sys.exc_info得到的异常信息为参数调用__exit__(exc_type, exc_value, exc_traceback);
出现异常时,如果__exit__(type, value, traceback)返回False,则会重新抛出异常,让with之外的语句逻辑来处理异常,这也是通用做法;如果返回True,则忽略异常,不再对异常进行处理。

Python 中 else 不仅可以和 if 搭配使用,还有另一种特有的句法是 for…else …,除此之外,它还可以和 while、try…except 组合使用
for…else… for 循环结束之后接着又执行了 else 语句块,for…else… 翻译成白话成了 直到… 然后 …
另外,即使 for 循环遍历的是一个空列表也会执行 else 语句块。而循环遇到 break 退出后,整个语句就结束,else 语句块也不执行了。综上,只有当循环里没有遇到 break 时,else 块才会执行。

try …except
try 后面写正常运行的程序代码,except即为异常情况
try …except…else 语句,当没有异常发生时,else中的语句将会被执行

a=3
b=2
for i in range(3):
    try:
        a = a - 1
        c=b/a
        print(c)

    except Exception as e:
        print(e)
    else:
        print("正常运行")

当执行try …finally 语句时,无论异常是否发生,在程序结束前,finally中的语句都会被执行

你可能感兴趣的:(python)