if-elif-else 多分支
当需要处理多个互斥条件时,if-elif-else 结构比嵌套 if-else 更清晰。程序从上到下依次检查每个条件,一旦某个条件为真,就执行对应的代码块,然后跳过剩余的所有分支。
基本语法
score = 85
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
elif score >= 70:
grade = "C"
elif score >= 60:
grade = "D"
else:
grade = "F"
print grade # B
elif 是 "else if" 的缩写。每个 elif 都有自己的条件,但只有在前面的所有 if 和 elif 都为假时才会被检查。
执行顺序的重要性
分支的顺序直接影响结果。上面的例子中,如果调换顺序:
score = 85
if score >= 60: # 85 >= 60 为真,进入这个分支
grade = "D"
elif score >= 70: # 不会检查!
grade = "C"
elif score >= 80: # 不会检查!
grade = "B"
else:
grade = "F"
print grade # D —— 错误!
因为 85 >= 60 为真,程序立即执行 grade = "D",跳过后面的所有 elif。所以必须把范围小的条件放在前面,或者使用互斥的精确范围:
# 方法 1:从大到小
if score >= 90:
grade = "A"
elif score >= 80:
grade = "B"
# ...
# 方法 2:精确范围(顺序无关,但冗长)
if 90 <= score <= 100:
grade = "A"
elif 80 <= score < 90:
grade = "B"
# ...
实际应用
# 根据月份判断季节
month = 4
if 3 <= month <= 5:
season = "Spring"
elif 6 <= month <= 8:
season = "Summer"
elif 9 <= month <= 11:
season = "Autumn"
else:
season = "Winter"
print season # Spring
# 根据 HTTP 状态码返回描述
status = 404
if status == 200:
msg = "OK"
elif status == 301:
msg = "Moved Permanently"
elif status == 404:
msg = "Not Found"
elif status == 500:
msg = "Internal Server Error"
else:
msg = "Unknown Status"
print msg # Not Found
没有 else 的情况
else 是可选的。如果所有条件都不满足,且没有 else,程序直接跳过整个结构:
age = 15
if age < 13:
group = "Child"
elif age < 20:
group = "Teenager" # 匹配这个分支
print group # Teenager
age = 25
if age < 13:
group = "Child"
elif age < 20:
group = "Teenager"
# 没有 else,age = 25 时 group 未定义
# print group # NameError: name 'group' is not defined
如果变量可能不被赋值,建议加上 else 作为兜底:
if age < 13:
group = "Child"
elif age < 20:
group = "Teenager"
else:
group = "Adult"
与字典的对比
当分支很多且条件简单时,字典查找有时比 if-elif 更清晰:
# if-elif 写法
if day == "Mon":
print "Monday"
elif day == "Tue":
print "Tuesday"
# ... 冗长
# 字典写法
days = {
"Mon": "Monday",
"Tue": "Tuesday",
"Wed": "Wednesday",
"Thu": "Thursday",
"Fri": "Friday",
}
print days.get(day, "Unknown")
字典查找的时间复杂度是 O(1),而 if-elif 是 O(n)(最坏情况)。但对于少量分支,性能差异可以忽略,选择可读性更好的写法即可。