一、為什么要學(xué)調(diào)試?一句話說明白
寫程序 = 搭積木;調(diào)試 = 找積木里哪塊放歪了。
學(xué)會(huì)調(diào)試,你就能把“報(bào)錯(cuò)”翻譯成“解決方案”,而不是“玄學(xué)”。
二、常用的 4 大調(diào)試工具(附代碼示例)
工具 | 說明 | 何時(shí)用 | 編程獅示例 |
---|---|---|---|
Traceback(報(bào)錯(cuò)堆棧) | 錯(cuò)誤 GPS,告訴你哪行炸了 | 運(yùn)行直接報(bào)錯(cuò) | 見下方【實(shí)戰(zhàn) 1】 |
print() 打印 |
在代碼里插“監(jiān)控?cái)z像頭” | 變量值看不見 | 見下方【實(shí)戰(zhàn) 2】 |
斷點(diǎn) breakpoint() | 讓程序暫停,逐行體檢 | 邏輯復(fù)雜不知哪一步出錯(cuò) | 見下方【實(shí)戰(zhàn) 3】 |
單元測試 | 寫“小考題”防止舊病復(fù)發(fā) | 改代碼后擔(dān)心崩 | 見下方【實(shí)戰(zhàn) 4】 |
三、實(shí)戰(zhàn) 1:3 步看懂 Traceback(以 NameError 為例)
在 編程獅在線Python3編輯器 輸入:
print(貓咪) # 故意寫錯(cuò):變量未定義
運(yùn)行后得到:
Traceback (most recent call last):
File "/tmp/cat.py", line 1, in <module>
print(貓咪)
NameError: name '貓咪' is not defined
逐行翻譯:
- File "/tmp/cat.py", line 1 → 第 1 行出錯(cuò)
- NameError → 錯(cuò)誤類型:名字未聲明
- name '貓咪' is not defined → 解釋器找不到“貓咪”是誰
修復(fù):貓咪 = "橘貓" print(貓咪) # 輸出:橘貓
四、實(shí)戰(zhàn) 2:用 print()
追蹤變量
需求:統(tǒng)計(jì)一段中文文本里有多少個(gè)“快樂”。
text = "我今天很快樂!因?yàn)閷W(xué)習(xí)編程很快樂~"
words = text.split(",") # 錯(cuò)誤:按逗號切,會(huì)把句子切碎
print("調(diào)試:當(dāng)前 words 列表 =", words) # 插監(jiān)控
count = 0
for w in words:
count += w.count("快樂")
print("調(diào)試:最終 count =", count)
通過打印發(fā)現(xiàn) words
切錯(cuò),修復(fù):
words = text.replace("!", "").replace("~", "").split() # 更穩(wěn)妥
五、實(shí)戰(zhàn) 3:一行代碼加斷點(diǎn),像看電影一樣慢放程序
在 編程獅在線Python3編輯器 或 Trae 里,給可疑行加:
breakpoint() # Python 3.7+ 內(nèi)置
示例(文件 fruit.py
):
def 首字母大寫(水果們):
結(jié)果 = []
for f in 水果們:
breakpoint() # 程序會(huì)在這里停
結(jié)果.append(f.capitalize())
return 結(jié)果
print(首字母大寫(["apple", "banana", 123]))
運(yùn)行后進(jìn)入交互模式,輸入:
p f
查看當(dāng)前變量c
繼續(xù)運(yùn)行
這樣就能發(fā)現(xiàn)123
不是字符串導(dǎo)致崩潰。
六、實(shí)戰(zhàn) 4:寫單元測試,讓 bug 永不復(fù)現(xiàn)
在 編程獅在線Python3編輯器 輸入:
from fruit import 首字母大寫
def test_正常字符串():
assert 首字母大寫(["apple"]) == ["Apple"]
def test_數(shù)字會(huì)被跳過():
assert 首字母大寫(["apple", 123]) == ["Apple", ""]
if __name__ == "__main__":
test_正常字符串()
test_數(shù)字會(huì)被跳過()
print("? 全部測試通過!")
運(yùn)行后若斷言失敗,會(huì)精準(zhǔn)提示哪條測試掛了,引導(dǎo)你修復(fù)源碼。
七、高頻報(bào)錯(cuò)對照表(收藏版)
英文報(bào)錯(cuò) | 中文翻譯 | 最常見原因 | 1 行修復(fù)示例 |
---|---|---|---|
SyntaxError: invalid syntax |
語法錯(cuò)誤 | 少冒號/括號 | if x == 1: |
IndentationError |
縮進(jìn)錯(cuò)誤 | Tab 與空格混用 | 統(tǒng)一用 4 空格 |
TypeError: can only concatenate str (not "int") to str |
類型錯(cuò)誤 | 字符串+數(shù)字 | str(num) + "歲" |
ModuleNotFoundError |
模塊不存在 | 沒裝庫 | pip install 包名 |
八、3 分鐘速通調(diào)試流程圖
graph TD
A[運(yùn)行報(bào)錯(cuò)] --> B{看 Traceback}
B -->|定位行號| C[加 print/breakpoint]
C --> D[修改變量/邏輯]
D --> E[寫測試防復(fù)發(fā)]
E --> F[提交代碼]
點(diǎn)擊查看Mermaid流程圖
九、課程推薦
想要系統(tǒng)學(xué)習(xí)Python請點(diǎn)擊《Python零基礎(chǔ)到高薪就業(yè)》