else不是独立语句,需要和其他语句搭配使用,有两大种用法,一是和if一起使用,作为条件语句的子句;另一个是和for、while或try语句搭配使用,循环或逻辑非正常完成时,else语句块才被执行。
条件语句子句
else作为if条件语句的子句时,比较简单,形式如下:
if condition1:
do something1
elif condition2:
do something2
elif condition3:
do something3
else:
do something4
当condition1、condition2、condition3条件都不满足时,执行else子句。
循环语句中else使用
Python中的for、while循环都有一个可选的else分支,在循环迭代正常完成之后执行。换句话说,如果循环以break语句或者return语句退出循环,else分支代码将不会执行。
示例如下:
def bk():
for k in range(3):
if k == 1:
break
print(k)
else:
print('iterated over everything')
def rt():
for i in range(3):
print(i)
return
else:
print('iterated over everything')
for j in range(3):
print(j)
else:
print('iterated over everything')
print('==========')
bk()
print('==========')
rt()
代码执行后,输出如下:
0
1
2
iterated over everything
==========
0
==========
0
上面代码的第一个循环中,我们在range(3)上迭代并打印每个数字。因为我们让循环正常完成,所以else分支也被执行;第二个bk函数中的循环,因为k=1时,执行了break跳出循环语句,所以else分支没有被执行;第三个rt函数中的循环,因为直接打印第一个数后return了,所以else分支也没有被执行。
同样不要忘记,以上所有也适用于while ... else ... 语句,如下:
i = 0
while i <= 2:
print(i)
i += 1
else:
print('iterated over everything')
print('--------------')
j = 0
while True:
if j > 2:
break
print(j)
j += 1
else:
print('iterated over everything')
代码执行后,输出结果为:
0
1
2
iterated over everything
--------------
0
1
2
else语句在循环中的一个常见使用案例是实现循环查找。假说你在查找一个满足特定条件的项目,同时需要进行附加处理,或者在未发现可接受的值时生成一个错误:
for x in data:
if meets_condition(x):
break
else:
# raise error or do additional processing
没有else语句的话,你需要设置一个标志,然后在后面对其检测,以此确定是否存在满足条件的值:
condition_is_met = False
for x in data:
if meets_condition(x):
condition_is_met = True
if not condition_is_met:
# raise error or do additional processing
这不是一个真正重要的东西,而在许多其他语言中你必须要如此做。但是类似Python的许多其他特性,else语句可以生成更加优雅的Python风格的(Pythonic)代码。毫无疑问,上面的例子中,使用else语句使得代码更加友好。这并不是说你不得不在循环中使用else语句,你总是可以使用标志等等。但是else语句常常可以使代码更加优雅、更具可读性。
try ... except ... else ... 的使用
与其他语言相同,在Python中,try ... except ... 语句主要是用于处理程序正常执行过程中出现的一些异常情况。在编程实践中通常可以把else和它们一起组合使用,形式如下:
try:
normal execution block
except A:
exception A handle
except B:
exception B handle
except:
other exception handle
else:
if no exception,get here
finally:
do final handle
上述语句的执行顺序如下:
- 正常执行的程序在try下面的normal execution block执行块中执行,在执行过程中如果发生了异常,则中断当前在Normal execution block中的执行跳转到对应的异常处理块中开始执行;
- python从第一个except X处开始查找,如果找到了对应的exception类型,则进入其提供的exception handle中进行处理,如果没有找到,则直接进入except块处进行处理。except块是可选项,如果没有提供,该exception将会被提交给python进行默认处理,处理方式则是终止应用程序并打印提示信息;
- 如果在normal execution block执行块中执行过程中没有发生任何异常,则在执行完Normal execution block后会进入else执行块中(如果存在的话)执行;
- 无论是否发生了异常,只要提供了finally语句,以上try/except/else/finally代码块执行的最后一步总是执行finally所对应的代码块;