初學Python時,我們可能都是通過print來調試程序,但這種方法效率不高。入門Python后,Pycharm的Debug功能還是有必要學一下的,可以提高調試代碼的效率。
什么是Debug模式:
簡單說Debug模式和正常運行唯一的區別,就是會在斷點處停下來,可以通過控制一行一行的去運行代碼,而且可以看到整個運行過程中所有變量的實時值。
如何設置斷點:
在代碼編輯區的行號后左鍵單擊,即可將該行設置為斷點,再次點擊則取消。
如何以Debug模式運行代碼:
方法1:點擊左上工具欄上的Debug圖標(蟲子圖形)
方法2:右擊,在菜單中點Debug
Debug運行時界面:
我們編寫2個示例代碼文件
test1.py:
1 from test2 import add 2 3 4 def fun(d): 5 a = d.get("a", 2) 6 b = d.get("b", 2) 7 c = add(a, b) 8 print(c) 9 for i in range(3*c): 10 print(i) 11 12 13 if __name__ == '__main__': 14 d = {"a": 1} 15 fun(d)
test2.py:
1 def add(x, y): 2 return x + y
設置斷點,開啟 debug 調試模式運行后,顯示如圖
可以看到,此時:
1.代碼編輯區藍條就是當前程序運行到的位置,即該運行c = add(a, b)了,但還沒有運行
2.代碼編輯區暗紅條就是當前程序設置的所有斷點行
3.左下是程序堆棧,藍條代表當前是運行到test1.py文件的第7行了,是在fun()函數中。
藍條下面那行,指是停在test1.py的第15行,即最開始運行程序,程序從13行的main開始,運行到第15行后,進入了fun()函數
4.右下是變量展示區,現在默認選中的是堆棧的頂部,即fun函數,可以看到,此時a,b,d變量的值。如果我們點堆棧的第2行,將顯示main那一層的變量和值。
Debug工具欄說明:
下面來看看Debug區最左邊那一豎排調試相關按鈕都是干啥的:
再來看看更重要的橫排按鈕:
1.跳轉到當前斷點(斷點后你為了查看邏輯可能去了其他文件或行,點這個就能回到當前斷點的行)
2.step over(F8快捷鍵):在當前層代碼單步執行。例子中即左下的堆棧,當前是test1.py第7行的fun函數,按F8后會執行第7行,停在第8行
3.step into(F7快捷鍵):單步執行,但會進入子函數。例子中左下堆棧頂是fun,test1.py:7,按F7后會進入add函數,跳轉到test2.py第2行的add函數,此時看左下堆棧頂就是add,tet2.py:2。如果一直按F7,則會一層層一直進入。
4.step into my code(Alt+Shift+F7快捷鍵):單步執行,只進入自己代碼的子函數,不會進入導入包的子函數。
我們把上面test1.py的代碼添加個requests語句,並把第8、9行設成斷點
test1.py:
1 from test2 import add 2 import requests 3 4 5 def fun(d): 6 a = d.get("a", 2) 7 b = d.get("b", 2) 8 requests.get("http://www.baidu.com") 9 c = add(a, b) 10 print(c) 11 for i in range(3*c): 12 print(i) 13 14 15 if __name__ == '__main__': 16 d = {"a": 1} 17 fun(d)
現在再來看代碼,test1.py,test2.py是我們自己的代碼,requests庫是我們引入的第3方包。
Debug運行后,停在第8行,按Alt+Shift+F7,會執行第8行,停在第9行(因為requests.get是導入庫的函數,不是自己的代碼,不進入)。再按一次Alt+Shift+F7,會跳轉到test2.py第2行的add函數,因為test2.py是自己的代碼。
5.force step into(Alt+Shift+F7快捷鍵):執行下一行忽略lib和構造對象等。
6.step out(Shift+F8快捷鍵):返回上一層函數(即左下堆棧的第2行)。
我們把test2.py的代碼多寫兩行
test2.py:
1 def add(x, y): 2 x += 1 3 y += 2 4 print(x) 5 print(y) 6 return x + y
重新Debug,當斷點到test1.py的c = add(a, b),按F7,進入test2.py第2行,再按F7停在第3行,如果你不想再看add()函數中的運行,按Shift+F8,會返回test1.py中
7.run to cursor(Alt+F9快捷鍵):直接運行至下一斷點處。
8.evaluate expression:計算表達式。
我們點擊這個計算器圖標后,在打開的界面中可以輸入表達式,點evaluate后會給出結果
我們也可以輸入類似:
d
d.get('a')
a * b
Debug變量區
接下來我們再看看右下的變量區,Debug過程中我們隨時可以查看到所有變量和對象的實時值。但真正的程序,變量成百上千,從中翻找1個變量太麻煩,我們可以設置特別關注的變量。點左側那一豎排按鈕中的+號,輸入變量a,則會在最上出現變量a,並高亮。-號就是刪除一個關注變量。
假如我們要關注的變量也有10個,加上原有的變量,一個窗口顯示太緊張,點擊眼鏡圖標,則會分開展示。
另外我們不光可以在右下的變量區查看變量,Debug過程中代碼后面也會顯示出實時變量的值。並且當點擊某變量后,也會浮窗顯示
最后,教大家2個調試的小技巧。
直接Debug循環的第X次:
如test1.py,我們只在print(i)處打斷點,希望看循環第6次i的值,正常運行到該行斷點后,我們可以F8單步調試,更快的可以F9或ALT+F9跳到下一個斷點,但即使這樣,也要按6次才能到,假如循環是10000次,我們想看第5000次那不累死了。
在該行斷點上右擊,在Condition中輸入表達式i==5,再次運行,則會跳過前4次,直接停在i為5的那次。
修改Debug過程中的變量值
或者我們也可以粗暴點,直接改i的值。我們取消上面Condition中的表達式,正常Debug,到斷點時,i=0,我們在右下變量區右擊i,選擇Set Value,把i的值改成5,再按F8單步運行,可以看到print出來的是5了。之后再按F8往下走時,i會回歸到正常值1
---------------------------------------------------------------------------------
關注微信公眾號即可在手機上查閱,並可接收更多測試分享~