python学习笔记 | 12.2、错误、调试和测试-调试
·
Python 调试入门(小白友好版)
我把廖雪峰老师的调试教程彻底简化,用最通俗的话、最清晰的结构、最实用的例子整理好,小白也能一看就懂、一学就会!
一、先搞懂:什么是调试?
写代码时,程序报错、运行结果不对、逻辑出错,我们需要找到错误并修复,这个过程就叫调试(Debug)。
Python 给我们准备了 5 种调试方法,从简单到高级,我按小白使用顺序讲:
- print () 打印法(最简单)
- assert 断言法(进阶版 print)
- logging 日志法(专业、不删代码)
- pdb 断点调试(命令行手动调试)
- IDE 图形调试(最舒服、工作常用)
二、5 种调试方法 思路 + 实例 + 解析
方法 1:print () 打印法(小白首选)
核心思路:把怀疑有问题的变量值打印出来,看看是不是你想要的。
优点:最简单、不用记任何语法缺点
实例代码
# 功能:用数字做除法,但是传入了 0,会报错
def foo(s):
n = int(s)
# 打印变量,看看 n 到底是多少
print(">>> n =", n)
return 10 / n
def main():
foo("0") # 故意传 0
main()
运行结果
>>> n = 0
ZeroDivisionError: division by zero
一眼就能看出:n 变成 0 了,所以除法报错!
方法 2:assert 断言法(自动检查)
核心思路:我,如果不成立,直接报错并提示我。 相当于:
语法:assert 条件, "错误提示"
- 条件为
True:正常运行 - 条件为
False:直接报错
优点:比 print 干净,可一键关闭缺点
实例代码
def foo(s):
n = int(s)
# 断言:n 绝对不能等于 0
assert n != 0, "n 不能是 0!"
return 10 / n
def main():
foo("0")
main()
运行结果
AssertionError: n 不能是 0!
一键关闭所有断言(正式运行程序时用):
python -O 文件名.py
方法 3:logging 日志法(企业最常用)
核心思路:把调试信息输出到日志,不报错、不污染运行结果,还能存文件。
最大优点:
- 不用删代码
- 可以分级别控制输出
- 可以存到文件里永久查看
实例代码(必背)
import logging
# 固定配置,加上就能输出日志
logging.basicConfig(level=logging.INFO)
s = "0"
n = int(s)
# 输出日志信息
logging.info(f"n 的值是:{n}")
print(10 / n)
##使用口诀
先写 import logging
再写 logging.basicConfig(level=logging.INFO)
想看变量就写 logging.info(f"变量={x}")
===完整标准用法(工作直接复制) 带格式 + 输出到文件(企业标准)
import logging
# 完整配置
logging.basicConfig(
level=logging.INFO,
format="%(asctime)s - %(levelname)s - %(message)s", # 日志格式
##%(asctime)s → 时间 ##%(levelname)s → 级别 ##%(message)s → 你写的内容
##连起来 = 漂亮专业的日志格式
filename="run.log" # 输出到文件!
)
# 测试
a = 10
b = 20
logging.debug("调试信息")
logging.info(f"计算 a + b,a={a}, b={b}")
logging.warning("这是警告")
logging.error("这是错误信息")
运行后:
控制台不输出
自动生成一个 run.log 文件
所有日志都保存在里面
===
运行结果
INFO:root:n 的值是:0
ZeroDivisionError: division by zero
日志级别(从低到高)
debug < info < warning < error
你设置什么级别,低于这个级别的日志就不显示,非常灵活!
方法 4:pdb 命令行调试(手动一步步走)
核心思路:让程序暂停,你可以手动查看变量、手动走下一步。
两种用法:
- 命令行启动:
python -m pdb 文件名.py - 代码里加断点(更常用)
断点实例(最实用)
import pdb
s = "0"
n = int(s)
pdb.set_trace() # 程序运行到这里自动暂停
print(10 / n)
调试常用命令(背 3 个就够)
p 变量名→ 查看变量值n→ 走下一步q→ 退出调试c→ 继续运行到结束
方法 5:IDE 图形调试(最舒服)
核心思路:用鼠标点一点,就能设置断点、看变量、单步运行。
推荐工具:
- VS Code(免费)
- PyCharm(专业好用)
使用步骤:
- 代码行号左边点一下,出现红点(断点)
- 点击调试按钮运行
- 程序会在断点暂停
- 直接看左边变量面板,不用输命令
这是工作中最常用的调试方式!
三、5 种方法对比(速查表)
表格
| 方法 | 难度 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|---|
| print() | ⭐ | 最简单 | 要手动删除 | 临时快速查错 |
| assert | ⭐⭐ | 自动检查 | 多了乱 | 简单逻辑校验 |
| logging | ⭐⭐⭐ | 专业、可存文件、不用删 | 要配置 | 项目开发、正式代码 |
| pdb | ⭐⭐⭐⭐ | 命令行万能调试 | 麻烦、费手 | 服务器无界面调试 |
| IDE 调试 | ⭐ | 可视化、舒服 | 需要装软件 | 平时写代码、工作 |
终极建议: 平时写代码用
正式项目用 logging
四、结构性总结(必背)
- 调试 = 找错 + 改错
- 最简单:
print(变量) - 自动检查:
assert 条件, 提示 - 专业永久:
logging(工作必用) - 命令行手动:
pdb.set_trace() - 最舒服:IDE 图形调试
五、练习题(小白实战,带答案)
练习 1:print 调试
下面代码会报错,请用 print() 找出错误原因。
def divide(a, b):
return a / b
print(divide(10, 0))
答案
def divide(a, b):
print("b =", b) # 打印查看
return a / b
print(divide(10, 0))
运行后看到 b=0,就知道是除 0 错误。
练习 2:assert 断言
给上面函数加断言,保证 b 不能为 0。
答案
def divide(a, b):
assert b != 0, "除数不能是 0"
return a / b
print(divide(10, 0))
练习 3:logging 日志
用 logging 输出变量值,不报错、不污染程序。
答案
import logging
logging.basicConfig(level=logging.INFO)
a = 10
b = 0
logging.info(f"a={a}, b={b}")
print(a / b)
练习 4:pdb 断点调试
在出错行前加断点,查看变量。
答案
import pdb
a = 10
b = 0
pdb.set_trace()
print(a / b)
===解析
import pdb # 1. 导入调试库
a = 10 # 2. 给 a 赋值
b = 0 # 3. 给 b 赋值
pdb.set_trace() # 4. ✨断点:程序在这里自动暂停!
print(a / b) # 5. 这行还没执行
===走向
一、程序整体走向(超级清楚)
正常不走断点时:
1 → 2 → 3 → 4 → 5
真正运行时(有断点):
1 → 2 → 3 → 4(暂停,进入调试模式)
→ 你手动控制 → 5(报错)
===
pdb.set_trace () = 让程序在这行停住,等你检查变量,检查完再继续跑。
调试时输入:p b 就能看到 b=0。
六、一句话总结
- 临时查错用 print
- 自动检查用 assert
- 正式项目用 logging
- 舒服调试用 IDE
你只要掌握 print + logging + IDE 调试,就能搞定 99% 的 Python 代码错误!
更多推荐

所有评论(0)