Python中神奇的else

与大多数语言一样,从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

用涵义明确的ifelse,替换了?:。 把含糊的东西变得明晰,这是令人欣赏的设计与理念。

循环与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

whilefor类似,这里用两段代码来简要说明流程。

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()

这种设计的微妙,唯有在充分的思考、或严酷的实战中,才能品味。

另外


相关笔记