元数据卡
- 前置知识:第3章(Git) + 本章 IDE 配置
- 预计时间:15 分钟
- 阅读模式:高度专注 + 边读边敲
- 完成标志:能设断点、步过/步进、看 VARIABLES 面板
你的进度
你已经架好了操作台(IDE)。但你还在用最原始的方法排查故障——往代码里塞 print(),跑一遍、看输出、改代码、再跑。
"我受够了每次刮铁屑、记读数、再刮铁屑的循环了。"
是时候让程序在运行时停住,让你亲眼看看里面发生了什么了。
第一场战斗:print() 打到手软
假设这是你有 bug 的代码:
# material_checker.py
def get_qualified_items(items, n=10):
valid = []
for it in items:
if it["weight"] > 0:
valid.append(it)
sorted_items = sorted(valid, key=lambda x: x["weight"], reverse=True)
return sorted_items[:n]
items = [
{"id": 1, "weight": 100},
{"id": 2, "weight": 0},
{"id": 3, "weight": 200},
{"id": 4, "weight": -50},
]
print(get_qualified_items(items, 2))语言: Python 3 如何运行: python material_checker.py问题: 重量为 -50 的工件没有被过滤掉——条件 > 0 本意是排除所有非正重量,但 -50 进来了。
传统做法:在每一行塞 print(it),跑一遍,删掉 print(),再跑一遍验证。改代码的代价打断了调试的节奏。
你能用一种更好的办法。
获得第一个技能:断点
断点就是你告诉调试器:"代码执行到这行,给我停住。"
在 VS Code 里,点一下行号左侧的空白——一个红色圆点出现:
# 调试器会在每次循环到这行时暂停
for it in items:
● if it["weight"] > 0: # ← 红点 = 断点
valid.append(it)如何运行: 按 F5 或点 VS Code 左边栏"运行和调试" → 选择"Python File" 预期效果: 编辑器停在那一行,整行高亮,程序在等你下指令。
调试工具栏:你的方向舵
程序停住后,顶部出现调试工具栏:
▶ 继续 | ⤵ 步入 | ⤴ 步出 | 重启 | 停止| 按钮 | 快捷键 | 用途 |
|---|---|---|
| 继续 | F5 | 运行到下一个断点或结束 |
| 步过 | F10 | 执行当前行,停到下一行(不进入函数内部) |
| 步进 | F11 | 进入当前行调用的函数内部 |
| 步出 | Shift+F11 | 跳出当前函数,回到调用者 |
选步过还是步进? 简单的规则:如果你想知道 sorted() 怎么写的不,用 步过;如果你想看自己写的函数怎么跑的,用 步进。
看看变量在发生什么
断点停住时,VS Code 左边栏自动出现 VARIABLES 面板:
VARIABLES
Locals
it: {'id': 1, 'weight': 100}
items: [{'id': 1, 'weight': 100} ...]
valid: []
n: 10你不必猜测 it["weight"] 等于多少——你亲眼看到了。
第一场战斗的复盘
断点停在 if it["weight"] > 0 上。当 it 轮到 {"id": 4, "weight": -50} 时:
- 条件成立吗?→
-50 > 0是False - 那它进不进
valid?→ 不进
如果你真正想过滤的是 weight < 0 的废品(0 重量是正常空工件),条件应该是 >= 0。断点在每次循环暂停时,你看一眼分支走向就知道了——不需要 print() 来回折腾。
→ 下一步
你学会了让程序停下来、一步步走。但遇到了更棘手的情况:一万个循环里只有一个 bug,我不想每次按 F5;函数调用链太深,我不知道谁调了谁。进阶调试技能就在下一站。