Python中神奇的else
2017-07-01 23:52:31 +08 字数:1030 标签: Python与大多数语言一样,从C语言中,Python吸取了else
关键字。
而不同的是,C语言的else
,只能用于与if
搭档。
Python中的else
,则用途广泛。
if else ¶
传统的if else
句式,Python当然也支持。
Python的分支语句形式如下:
if condition:
pass
elif another_condition:
pass
else:
pass
在else
上,与C语言别无二致。
而多了一个elif
,替代C语言中的else if
。
其实,C语言中的else if () {}
,看做else { if () {} }
也未尝不可。
所以Python其实是用elif
关键字,禁止了一些C语言中else
的模糊特性。
替代三元运算符 ¶
在C语言中,有时会写三元运算符,来替代一些简单的逻辑判断。
比如:
if (condition) {
value = true_value;
} else {
value = false_value;
}
等效于:
value = condition ? true_value : false_value;
而在Python中,则是:
value = true_value if condition else false_value
用涵义明确的if
与else
,替换了?
与:
。
把含糊的东西变得明晰,这是令人欣赏的设计与理念。
循环与else ¶
执行循环(while)与迭代(for),有时需要分辨它们是自然结束,还是被break
。
这在传统做法中,可以使用标志位来判断、重新判断终止条件、或者使用return
来代替break
。
而在Python中,则可以使用else
来简化。
for else ¶
比如:
for i in range(n):
if i == 5:
break
如果需要知道是否自然结束,需要判断i
的值。
i = 0
for i in range(n):
if i == 5:
break
if i != 5:
normal_end()
显然,这样其实重复做了判断。
使用else
,则代码变为:
for i in range(n):
if i == 5:
break
else:
normal_end()
while else ¶
while
与for
类似,这里用两段代码来简要说明流程。
while True:
break
else:
normal_end()
这段代码的normal_end()
不会被执行。
while False:
break
else:
normal_end()
这段代码的normal_end()
会被执行。
第一段代码,while
是死循环,在循环第一次时,被break
,
所以不会执行normal_end()
。
而第二段则相反,是空循环,立即自然退出了。
try else ¶
Java的异常处理,是做得很不错的。 它的一般形式如下:
try {
do_sth();
} catch(SomeException e) {
handleException(e);
} finally {
cleanUp();
}
这个形式,能简单解决大多数问题。
但是,如果想在cleanUp()
的时候,知道是否发生了异常,就麻烦了。
比如,如果不发生异常,就做doNext()
,否则就不做。
代码修改如下:
try {
doSth();
doNext();
} catch(SomeException e) {
handleException(e);
} finally {
cleanUp();
}
doNext()
不得不放在try
块中。
在Python的else
语句支持下,上面代码可以改成:
try:
do_sth()
except SomeException as e:
handle_exception(e)
else:
do_next()
finally:
clean_up()
这种设计的微妙,唯有在充分的思考、或严酷的实战中,才能品味。
另外:
- 撇开
except
,单独使用try else
,是不允许的。 - 如果
else
块中抛出异常,会在finally
块执行后,向外层抛出。