Pycharm debug調(diào)試教程
debug,就是對于結(jié)果不符合預(yù)期的程序,將程序執(zhí)行的過程放慢甚至中途暫停,通過逐步排查中間變量或者輸出以定位有故障的代碼段的過程。這個過程可以看作是逐步調(diào)試程序的方法。當我們點擊“運行”時,程序并不是一下子全部執(zhí)行完畢,而是逐步執(zhí)行各個部分,每執(zhí)行完一部分就檢查結(jié)果是否符合預(yù)期。如果發(fā)現(xiàn)有問題,就暫停執(zhí)行,逐行檢查并修正,直到該部分的代碼達到預(yù)期效果再繼續(xù)執(zhí)行下一部分。
breakpoint(斷點調(diào)試),就是在程序自動運行的過程中,我們在代碼某一處打上了斷點,當程序跑到我們設(shè)置的斷點位置處使,則會中斷下來,此時可以看到之前運行過的所有程序變量。
1.如何給程序打斷點?
2.如何開啟Debug調(diào)試?
3.Debug控制臺各按鈕功能
- step over(F8快捷鍵):在單步執(zhí)行時,在函數(shù)內(nèi)遇到子函數(shù)時不會進入子函數(shù)內(nèi)單步執(zhí)行,而是將子函數(shù)整個執(zhí)行完再停止,也就是把子函數(shù)整個作為一步。在不存在子函數(shù)的情況下是和step into效果一樣的。
- step into(F7快捷鍵):在單步執(zhí)行時,遇到子函數(shù)就進入并且繼續(xù)單步執(zhí)行,有的會跳到源代碼里面去執(zhí)行。
- step into my code(Alt+Shift+F7快捷鍵):在單步執(zhí)行時,遇到子函數(shù)就進入并且繼續(xù)單步執(zhí)行,不會進入到源碼中。
- step out(Shift+F8快捷鍵):假如進入了一個函數(shù)體中,看了兩行代碼,不想看了,跳出當前函數(shù)體內(nèi),返回到調(diào)用此函數(shù)的地方。
- Resume program(F9快捷鍵):恢復(fù)程序,直接運行到下一斷點處。若無下一斷點,則直接跑完程序。
一般操作步驟:設(shè)置好斷點,debug運行,然后 F8單步調(diào)試,遇到想進入的函數(shù) F7 進去,想出來在 Shift+F8,跳過不想看的地方,直接設(shè)置下一個斷點,然后 F9 過去。
4.控制臺各變量類型的圖標
每個變量左側(cè)的圖標指示其類型。
5.Debug調(diào)試示例1
- 設(shè)置斷點,debug運行
- 執(zhí)行一次step into(F7快捷鍵)
- 執(zhí)行一次step over(F8快捷鍵)
再執(zhí)行一次step over(F8快捷鍵)
再執(zhí)行一次step over(F8快捷鍵)
再執(zhí)行一次step over(F8快捷鍵)
再執(zhí)行一次step over(F8快捷鍵)
- 看夠了循環(huán),想直接看最終 result 加完的結(jié)果,直接在結(jié)果處打斷點,執(zhí)行Resume program(F9快捷鍵)
- 執(zhí)行一次step out(Shift+F8快捷鍵),跳出當前函數(shù),返回到調(diào)用此函數(shù)的地方。
- 執(zhí)行一次step over(F8快捷鍵)
- 再執(zhí)行一次step over(F8快捷鍵)
第一個示例就完成了?。?!
6.Debug調(diào)試示例2
運行示例程序2,計算輸入的不同水果的平均數(shù)量。
程序拋出一個異常,可以看到它的運行窗口中的堆棧跟蹤(Traceback)。可以單擊Traceback中的文件名和行號導(dǎo)航到編輯器。設(shè)置一個斷點開始調(diào)查問題吧!?。。▎螕粢O(shè)置斷點的溝槽gutter,或者將光標插入該行并按Ctrl+F8)
開始調(diào)試程序,點擊toolbar的小蟲子圖標,或者按Shift+F9。
想要檢查函數(shù)是否發(fā)生了異常,可以計算調(diào)用這個函數(shù)的表達式。復(fù)制選定的表達式并且將其粘貼到Debug窗口Evaluate expression處。
按下Enter評估表達式。
可以看出這個表達式會導(dǎo)致異常,將此表達式添加到Debugger watches中,使其在將來自動計算。點擊Debug窗口的圖標。
為了找出導(dǎo)致這種異常的原因,單步執(zhí)行選中的代碼。(點擊Debug窗口的圖標,或者按F7)
注意到,有幾個嵌套調(diào)用,step into之后將他們都高亮了。按←去選擇extract_number
函數(shù),然后按Enter去單步執(zhí)行。
讓我們來看看我們要傳遞給int
的是什么。按Ctrl+Alt+F8為選中的參數(shù)調(diào)用快速求值表達式。
這個函數(shù)的目的是提取數(shù)字,但是可以看到目前提取的是字符串apple
,有一個數(shù)組索引的錯誤,將索引值0修改為1。
重新運行我們的項目。
檢查一下在修改后,調(diào)用extract_number
是否還會拋出異常。單擊step over(不進入函數(shù)的單步執(zhí)行)或者按F8。
可以看到調(diào)用沒有拋出異常,按F9或者單擊resume program(恢復(fù)程序執(zhí)行,直到碰到下一個斷點)。
又一次的跳到了我們設(shè)置的斷點的位置,但是我們不需要停在這里了,因為這個地方的異常已經(jīng)解決了。所以mute此處的斷點,點擊Mute Breakpoint。
最后,檢查一下find_average
的結(jié)果,首先將光標移動到return語句前,按Alt+F9執(zhí)行程序到當前光標的那一行。
按Ctrl+Alt+F8為選中的參數(shù)調(diào)用快速求值表達式。結(jié)果正確,結(jié)束Debug調(diào)試。
第二個示例就完成了?。。?/p>
7.Debug調(diào)試示例3
設(shè)置斷點,debug運行。
console窗口用于和程序交互或者是查看程序的打印。鍵盤輸入a的值。
現(xiàn)在想要進入classify
函數(shù)中,執(zhí)行一次step into(F7快捷鍵)或者step into my code(Alt+Shift+F7快捷鍵)
想看一下函數(shù)內(nèi)部的細節(jié),執(zhí)行兩次step over(F8快捷鍵)
想看一下incr_by_two()
這個函數(shù),直接step into(F7快捷鍵)進去。
進來又不想看這個函數(shù)了,直接step out(Shift+F8快捷鍵)跳出當前函數(shù)體,返回到調(diào)用此函數(shù)的地方。
想直接查看classify
函數(shù)返回的結(jié)果,在打一個斷點,然后Resume program(F9快捷鍵)直接運行到斷點處。
不想一步一步執(zhí)行了,直接Resume program(F9快捷鍵)跑完剩余的代碼。
第三個示例就完成了?。。?/p>
附錄
示例程序1
def sum_demo(x, y): for _ in range(2): x += 1 y += 1 result = x + y return result if __name__ == '__main__': result = sum_demo(1, 1) print(result)
示例程序2
def find_average(value): check_input(value) result = 0 for s in value: result += validate_number(extract_number(remove_quotes(s))) return result / len(value) def prepare_values(): return ["'apple 1'", "orange 2", "'tomato 3'"] def extract_number(s): return int(s.split()[0]) def check_input(value): if (value is None) or (len(value) == 0): raise ValueError(value) def remove_quotes(s): if len(s) > 1 and s[0] == "'" and s[-1] == "'": return s[1:-1] return s def validate_number(number): if number < 0: raise ValueError(number) return number average = find_average(prepare_values()) print("The average is ", average)
示例程序3
def incr_by_one(num): print('Increase by one.') return num + 1 def incr_by_two(num): print('Increase by two.') return num + 2 def classify(num): print('if num is odd, increase by one; if num is even, increase by two.') if num % 2 == 0: result = incr_by_two(num) else: result = incr_by_one(num) return result if __name__ == '__main__': a = input('Please input an integer:') result = classify(int(a)) print(result)
參考
到此這篇關(guān)于Pycharm debug調(diào)試教程的文章就介紹到這了,更多相關(guān)Pycharm debug調(diào)試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python中使用partial改變方法默認參數(shù)實例
這篇文章主要介紹了Python中使用partial改變方法默認參數(shù)實例,本文直接給出使用實例,代碼中包含詳細注釋,需要的朋友可以參考下2015-04-04python通過socket搭建極簡web服務(wù)器的實現(xiàn)代碼
python的web框架眾多,常見的如django、flask、tornado等,其底層是什么還是有些許的疑問,所以查找相關(guān)資料,實現(xiàn)瀏覽器訪問,并返回相關(guān)信息,本文將給大家介紹python通過socket搭建極簡web服務(wù)器,需要的朋友可以參考下2023-10-10Django高級編程之自定義Field實現(xiàn)多語言
這篇文章主要介紹了Django高級編程之自定義Field實現(xiàn)多語言,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-07-07python創(chuàng)建與遍歷List二維列表的方法
這篇文章主要介紹了python創(chuàng)建與遍歷List二維列表的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-08-08用pytorch的nn.Module構(gòu)造簡單全鏈接層實例
今天小編就為大家分享一篇用pytorch的nn.Module構(gòu)造簡單全鏈接層實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-01-01