3.2.3 多路分支结构
如果我们还想进一步改进程序 3.3,使之在-6 < c < 35 的情况下也显示一些信息,这 就需要一个三路的分支结构。三路分支可以利用两个嵌套的 if-else 语句来实现:
if c >= 35:
print "Warning: Heat Wave!"
else:
if c <= -6:
print "Warning: Cold Wave!"
else:
print "Have fun!"
由于 if-else 语句中的<if-语句体>或<else-语句体>可以由任何 Python 语句组成,因此我们 可以再使用一条 if-else 语句,这称为语句的嵌套。分析上面这段代码可知,两条嵌套的 if-else 语句确实实现了三个分支,分别处理 c>=35、c<=-6 和-6<c<35 等三种情形。参见图 3.6, 其中顶层控制结构是一条 if-else 语句,虚线框整体视为它的一个分支;虚线框内是另一条 if-else 语句,它嵌套在顶层条件语句的 else 部分中。
图 3.6 用嵌套 if-else 实现三路分支
用嵌套 if-else 语句虽然能实现三路分支,但并非最好的方法。首先,这种用两个二路分 支来间接实现一个三路分支的做法使得三个分支不在一个层次上,不太符合原问题中的三个 并列分支的题意。其次,这种做法不适合需要更多分支的问题,例如实现五路分支时就必须 采用四层嵌套的 if-else 结构,这会使程序看上去非常难读,尤其是 Python 所要求的下层结构向右缩进的特点会使这条嵌套语句在水平方向占据过宽的空间,导致代码更加难读。
Python 中有一个更好的做法来写多路分支的条件判断,即 if-elif-else 语句。这条语句在 形式上其实是将嵌套 if-else 语句中的 else 与后续的 if 合并成了一个 elif 子句,形如:
if <条件 1>:
<情形 1 语句体>
elif <条件 2>:
<情形 2 语句体>
...
elif <条件 n>:
<情形 n 语句体>
else:
<其他情形语句体>
if-elif-else 语句的语义是:顺序计算每一个条件表达式,找到第一个为 True 的条件,然后执行其下方缩进的语句体,执行完毕再将控制转到整个 if-elif-else 语句的下一条语句;如 果所有条件表达式的计算结果都是 False,则执行在 else 下方缩进的语句体。可见,这种形式 的条件语句实现了 n+1 个分支。另外,else 子句是可选的,但要注意的是,如果省略 else 子 句,则整个语句就可能没有符合条件的分支,从而不执行任何语句体。
不难看出,if-elif-else 语句既能像嵌套 if-else 结构一样实现多路分支,又具有各分支并列 的整齐划一的代码形式,这就解决了嵌套 if-else 语句的两个不足之处。下面我们利用 if-elif-else 结构来进一步改进温度转换程序:
【程序 3.4】eg3_4.py
f = input("Temperature in degrees Farenheit: ")
c = (f - 32) * 5.0 / 9
print "Temperature in degrees Celsius:", c
if c >= 35:
print "Warning: Heat Wave!"
elif c <= -6:
print "Warning: Cold Wave!"
else:
print "Have fun!"