Python基础刻意练习:else和with语句

task9

绝大部分编程语言中都有条件判断语句,比如 if … else ,在大部语言中,else 一般只在条件判断语句中出现,与 if 语句配套出现,不过在 Python 中,else 除了能与 if 这样的条件判断一起出现外,还能出现在 for、while 这样的循环语句中。

一.else相关语句
1.while…else语句

eg:

 a=0
>>> b=0
>>> while a<10 and b<=9:
	print("%d is less than 10"%a)
	a+=1
	b+=1
else:
	print("%d is not less than 10"%a)

在这里插入图片描述
可以看出for中的语句和普通的语句没有什么差别,else中的语句会在循环执行完后进行(排除有break的情况,此时会直接跳出)。

2.while…else语句

eg:

 def ax_find(a,b):
	c=0
	while c<len(a):
		if a[c]==b:
			break
		c+=1
	else:
		c-=1
	return c

在这里插入图片描述
可以看出while中的语句与正常语句没有什么差别,else中的语句会在循环执行完后进行(排除有break的情况,此时会直接跳出)。

3.try…except…else语句

语法格式:

try:
正常语句执行
except:
若发生异常则执行此块代码
else:
若未发生异常则执行此块代码

eg:

>>> a=10
>>> b=10
>>> try:
	a=b
	print(a)
except:
	print(False)
else:
	print(True)

在这里插入图片描述

二.with相关语句

with语句的原理:
①上下文管理协议(Context Management Protocol):包含方法 enter()和__exit__(),支持该协议的对象要实现这两个方法;
②上下文管理器(Context Manager):支持上下文管理协议的对象,这种对象实现了__enter__()和__exit__()方法。上下文管理器定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作。通常使用with语句调用上下文管理器,也可以通过直接调用其方法来使用。
语法格式:

with EXPR as VAR:
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,则忽略异常,不再对异常进行处理。

自定义的上下文管理器要实现上下文管理协议所需要的__enter__()和__exit__()两个方法:
eg:

f=open('/axa/axa.txt')
try:
for line in f.readlines():
print(line)
finally:
f.close()

上面的写法虽然可以正常执行,但是我们会发现,每次都需再手动关闭文件,下面加入with语句来解决这个问题:
eg:

class opened(object):
    def __init__(self, name):
        self.handle = open(name)
    def __enter__(self):
        return self.handle
    def __exit__(self, type, value, trackback):
        self.handle.close()
with opened('/tmp/a.txt') as f:
    for line in f.readlines():
        print(line)

注意我们定了一个名字叫opened的辅助类,并实现了__enter__和__exit__方法,__enter__方法没有参数,__exit__方法的3个参数,分别代表异常的类型、值、以及堆栈信息,如果没有异常,3个入参的值都为None。

以上就是我整理的task9的全部内容,感谢你的浏览。
参考文献:
https://www.jb51.net/article/51045.htm
https://blog.csdn.net/m0_37822685/article/details/80259402
https://www.jellythink.com/archives/530

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值