在 Python 里,缩进就是逻辑的一部分。缩进在 if、elif、else、for 和 while 之下的行才属于它们,所以挪动一行就会改变程序的行为。
这一课接在 把算法对应成 Python 函数 之后,属于 过渡到 Python 与代码运行。
Python 怎样判断哪些行在块里面?
以冒号结尾的行会打开一个块。往下缩进一层的每一行都在块里面。第一行缩回去的就在块外面,在块结束后才运行。
对于分支,if、elif 和 else 按顺序检查,只有第一个条件为 True 的分支会运行。else 接住剩下的所有情况。
例题
任务:分数 70 或以上返回 “High”,40 到 69 返回 “Middle”,其余返回 “Low”。
def band(mark):
if mark >= 70:
return "High"
elif mark >= 40:
return "Middle"
else:
return "Low"
第 1 步,选边界测试值。 边缘是 70、69、40 和 39。
第 2 步,逐个追踪。
| mark | mark >= 70 | mark >= 40 | 结果 |
|---|---|---|---|
| 70 | True | 不检查 | High |
| 69 | False | True | Middle |
| 40 | False | True | Middle |
| 39 | False | False | Low |
因为第一个分支已经接住 70 及以上,elif 不需要再写“并且低于 70”。
要提防的错误
常见的失误是对本应互相排斥的选择使用分开的 if 语句。
错误答案:
def band(mark): result = "Low" if mark >= 70: result = "High" if mark >= 40: result = "Middle" return result输入 80 时,第一个
if设为 “High”,然后第二个if也是 True,把它覆盖成 “Middle”。所以 80 分返回 “Middle”。
改正的做法是把第二个 if 改成 elif,这样只有第一个条件为 False 时才会检查它。测试一个远高于最高边界的分数,例如 80,马上就能暴露这个问题。
缩进在循环里也会以同样的方式出错:
total = 0
for n in [1, 2, 3]:
total = total + n
print(total)
这会输出 1, 3, 6。如果把 print(total) 往回缩一层,它就在循环之后,只输出 6。
自我检测
1. check(15) 和 check(3) 分别输出什么?
def check(n):
if n > 10:
print("big")
print("done")
查看答案
check(15) 先输出 big 再输出 done。check(3) 只输出 done,因为 print("done") 没有缩进在 if 之下,所以每次都会运行。
2. sign(0) 返回什么?
def sign(n):
if n > 0:
return "positive"
elif n < 0:
return "negative"
else:
return "zero"
查看答案
“zero”。0 > 0 是 False,0 < 0 是 False,所以执行 else。
3. 为什么 40 是测试 band 的好数值?
查看答案
它正好在 mark >= 40 的边界上。如果学生写成 > 而不是 >=,40 会返回 “Low”,错误就暴露出来了。
接下来学什么
下一课学习区分“程序崩溃”和“悄悄出错”:区分语法错误与错误结果。你可以在 Python 推理沙盒 里用自己的测试值运行 band,或者把同样的分支写成伪代码,再用 受限伪代码追踪训练器 检查。
如果分支题总是在边界上失分,可以看看我们的 线上一对一计算机科学补习。