要预测一段 Python 代码的输出,别指望一眼“看出”答案。顺着代码的执行顺序往下读,随时记下每个变量的当前值,并写下每一个传给 print() 的值。无论是新手的简短练习,还是把循环、条件和表达式组合在一起的长代码片段,这个方法都适用。
核心原则:模拟执行,不要猜
除非有控制结构改变执行路径,否则 Python 会按顺序逐条执行语句。你要做的,就是一步不落地模拟这个执行过程。
读代码时,边读边填一张小小的追踪表:
| 步骤 | 代码行或操作 | 当前变量值 | 打印输出 |
|---|---|---|---|
| 1 | score = 4 | score = 4 | |
| 2 | score = score + 3 | score = 7 | |
| 3 | print(score) | score = 7 | 7 |
对于这段代码:
``python
score = 4
score = score + 3
print(score)
``
输出是:
``text
7
``
第二次赋值不会显示任何东西,只是用新值替换掉 score 原来的值。只有 print(score) 会产生看得见的输出。
有个好习惯:把计算机“存了什么”和“显示了什么”分开看。变量负责存值,print() 负责显示值。
第 1 步:从变量和赋值开始
每遇到一条赋值语句,就立刻更新追踪记录。
``python
pet = "cat"
pet = "dog"
print(pet)
``
输出:
``text
dog
``
变量不会同时记住两个值。第二次赋值之后,pet 指向的就是 "dog"。
再看一个用到变量旧值的赋值:
``python
points = 10
points = points - 4
points = points * 2
print(points)
``
追踪一下:
| 语句 | 执行后 points 的值 |
|---|---|
points = 10 | 10 |
points = points - 4 | 6 |
points = points * 2 | 12 |
输出:
``text
12
``
points = points - 4 要从右往左读:先用 points 的当前值算出右边的表达式,再把结果存回 points。
第 2 步:先算表达式,再更新变量
执行赋值语句时,Python 会先算出等号右边的值,再完成赋值。
``python
x = 5
y = x + 2
x = 1
print(x, y)
``
输出:
``text
1 7
``
执行 y = x + 2 这一行时,x 还是 5,所以 y 变成 7。之后再改 x,并不会回过头去改变 y。
这是答错的常见原因:看到 x 的最终值,就不小心把它代入了前面的代码行。
注意表达式内部的运算顺序
先算乘除,再算加减。
``python
result = 2 + 3 * 4
print(result)
``
输出:
``text
14
``
Python 先算 3 * 4,再加上 2。
加上括号,结果就不一样了:
``python
result = (2 + 3) * 4
print(result)
``
输出:
``text
20
``
预测输出时,先算括号里的表达式,再算乘除,最后算加减。
第 3 步:逐轮追踪每一次循环
for 循环会对序列中的每个元素各执行一次循环体。不要把好几轮循环压缩成脑子里的一步。
```python total = 0
for number in [2, 4, 6]: total = total + number
print(total) ```
追踪表:
| 本轮取值 | 相加前的 total | 相加后的 total |
|---|---|---|
| 2 | 0 | 2 |
| 4 | 2 | 6 |
| 6 | 6 | 12 |
输出:
``text
12
``
循环体执行了三次。print(total) 没有缩进,所以要等循环结束后才执行。
缩进很关键,它决定了哪些语句属于循环:
```python for number in [1, 2, 3]: print(number)
print("done") ```
输出:
``text
1
2
3
done
``
第一个 print() 在循环内部,执行了三次;最后一个 print() 在循环外面,只执行一次。
追踪之前先弄清 range()
对于 range(start, stop),Python 包含 start,但不包含 stop。
``python
for n in range(2, 5):
print(n)
``
输出:
``text
2
3
4
``
追踪循环体之前,先把实际取值写在循环旁边。这里应该写 2, 3, 4,别想当然地以为 5 也包括在内。
第 4 步:用当前值判断条件
if 语句决定走哪条路径。条件要在 Python 执行到这一行的那一刻,用当时的变量值来判断。
```python temperature = 18
if temperature > 20: print("warm") else: print("cool") ```
输出:
``text
cool
``
18 > 20 不成立,所以 Python 跳过第一个代码块,执行 else 代码块。
循环里的条件,每一轮都要重新单独判断:
``python
for n in [1, 2, 3, 4]:
if n % 2 == 0:
print(n)
``
输出:
``text
2
4
``
% 运算符返回余数。一个数除以 2 余数为 0,它就是偶数。
完整的追踪过程如下:
n | n % 2 == 0 | 输出 |
|---|---|---|
| 1 | 假 | |
| 2 | 真 | 2 |
| 3 | 假 | |
| 4 | 真 | 4 |
别把 if 条件当成贴在整个循环上的标签。循环体每执行一次,都要重新判断一次这个条件。
第 5 步:弄准 print() 的输出格式
print() 有自己的一套格式规则。用逗号分隔传入多个值时,Python 通常会在它们之间加一个空格。
``python
name = "Milo"
age = 3
print(name, age)
``
输出:
``text
Milo 3
``
字符串和数字之所以能这样一起打印,是因为 print() 会把传入的每个值都转换成适合显示的格式。
再对比一下字符串拼接:
``python
name = "Milo"
age = 3
print(name + str(age))
``
输出:
``text
Milo3
``
这里 str(age) 把数字转成文本,+ 把两个字符串直接连起来,中间不加空格。
还要注意在循环内打印和在循环外打印的区别:
```python count = 0
for n in range(3): count = count + 1 print(count)
print("final:", count) ```
输出:
``text
1
2
3
final: 3
``
输出一共四行,因为缩进的 print(count) 每轮循环都会执行一次。
完整示例:变量、循环加条件
先别看讲解,自己追踪一下这段代码:
```python total = 0
for n in range(1, 5): if n % 2 == 1: total = total + n
print(total) ```
首先,把 range(1, 5) 展开成 1, 2, 3, 4。
n | n 是奇数吗? | 本轮结束后的 total |
|---|---|---|
| 1 | 是 | 1 |
| 2 | 否 | 1 |
| 3 | 是 | 4 |
| 4 | 否 | 4 |
输出:
``text
4
``
只有 1 和 3 满足条件,所以只加上了这两个值。最后的 print(total) 在循环结束后执行。
Python 输出题快速检查清单
确定答案之前,先核对以下几点:
- 每次赋值之后,我都更新了对应变量的值吗?
- 我用的是当时那一刻的变量值,而不是后来的值吗?
- 我列出每一轮循环了吗?
range()的终点取不取得到,考虑了吗? - 循环过程中,我每一轮都单独判断了
if条件吗? - 我数清每一条
print()语句、看清它的缩进了吗? - 输出里的空格、换行和标点,我都原样保留了吗?
只要有一项的答案是“没有”,就把代码重新追踪一遍。大多数错误都出在漏掉了某一次状态变化,而不是 Python 语法有多难。
练习时别太早看答案
预测代码输出是一种推理能力:先确定当前状态,套用一条规则,更新状态,然后重复。最好的练习方式是做一批简短、多样的代码片段,而且每道题都要在看到运行结果之前,先给出自己的答案。
用 PurrLearn 的 Python 输出测验练习逐行读代码。某道题答错了,就找出你的追踪从哪一步开始和 Python 的实际执行分道扬镳;这比单纯记住正确输出有用得多。
常见问题
不运行代码,怎么预测 Python 的输出?
在纸上或用追踪表模拟执行。每次赋值后记下变量的值,列出每一轮循环,逐一判断条件,再按顺序抄下每一个传给 print() 的值。
Python 是从上到下执行代码的吗?
通常是。Python 按顺序执行语句,但循环会重复执行缩进的代码块,条件判断也可能跳过某些代码块。函数、异常等特性会让情况更复杂,但对新手级的代码片段来说,从上到下逐行追踪就是正确的出发点。
为什么 range(1, 5) 的最后一个数不是 5?
range() 的第二个参数是停止点,本身不包含在结果里。range(1, 5) 生成的是 1、2、3 和 4。
Python 输出题最常见的错误是什么?
特别常见的一种是:计算前面某一行代码时,用了变量的最终值。解决办法很简单:每条改变变量的语句执行完,都写下这个变量当时的值。
需要背 Python 输出的套路吗?
记住几条规则就够了,比如赋值顺序、缩进、运算符优先级和 range() 的端点。但每遇到新的代码片段,都要追踪它实际的执行过程,别依赖一个只是看起来相似的套路。