引言
前面在学习python基础知识的时候,学习到else分子不是条件分支独有的,在异常、循环语句中也可以看到else的使用。这对于从其他语言(特别是c/c++、java等)转过来的同学来说是一个“很特别”的特性。
刚开始学习python语言时,我也不太理解为什么要从语法层面增加这个“语法糖”,阅读了《编写高质量代码--改善python程序的91个建议》之后,才理解还是有几个场景可以通过else语句来简化,现记录下来以方便后续查阅,也加深理解。
场景一:else可以判断循环是否由break退出
经常有这样一种情况,通过循环来处理一堆数据,当满足一定的条件时调用break
语句跳出循环。当没有else语句的时候,我们需要使用一个变量来判断循环是遍历结束,还是由break
语句引发的结束。例如下面例子
def print_prime(n):
for i in range(2, n):
found = True
for j in range(2, i):
if i % j == 0:
found = False
break
if found:
print(f'{i} is a prime number')
print_prime(11)
很简单的一段代码,就是查找小于n的素数,这里需要一个变量found来判断是否找到(如果走到break
就说明这个数不是素数)
我们把这个例子改成使用else分支,else分支只有在循环正常退出(这里通过break、异常等引发的退出都不属于正常退出)时才执行。也即能走else分支就说明此数为素数。改进后的代码如下:
def print_prime(n):
for i in range(2, n):
for j in range(2, i):
if i % j == 0:
break
else:
print(f'{i} is a prime number')
print_prime(11)
场景二:else可以判断try块中代码是否正常执行完成
这个场景实际上也跟循环类似,在异常场景下,只有当try
语句块内的代码正常执行完成之后才会执行else分支。
注意:
finally
语句是不管try
语句块代码是正常执行完,还是引发了异常,都会执行。也即能走else
的代码流程,肯定能走finally
,相反则不一定。
一般情况下,在异常处理的代码块中,只需要在正常执行完成之后才执行的代码可以放在else分支,例如书中说的数据库的事务提交动作。这里不再举例说明
总结
其实了解了else分支在循环、异常处理下的含义之后就可以很好的理解这个“语法糖”能使用的场景了
网友评论