文章目录
Pycharm debug调试教程(零基础轻松上手)
debug,就是对于结果不符合预期的程序,将程序执行的过程放慢甚至中途暂停,通过逐步排查中间变量或者输出以定位有故障的代码段的过程。这个过程可以看作是逐步调试程序的方法。当我们点击“运行”时,程序并不是一下子全部执行完毕,而是逐步执行各个部分,每执行完一部分就检查结果是否符合预期。如果发现有问题,就暂停执行,逐行检查并修正,直到该部分的代码达到预期效果再继续执行下一部分。
breakpoint(断点调试),就是在程序自动运行的过程中,我们在代码某一处打上了断点,当程序跑到我们设置的断点位置处使,则会中断下来,此时可以看到之前运行过的所有程序变量。
1.如何给程序打断点?
2.如何开启Debug调试?
3.Debug控制台各按钮功能
- step over(F8快捷键):在单步执行时,在函数内遇到子函数时不会进入子函数内单步执行,而是将子函数整个执行完再停止,也就是把子函数整个作为一步。在不存在子函数的情况下是和step into效果一样的。
- step into(F7快捷键):在单步执行时,遇到子函数就进入并且继续单步执行,有的会跳到源代码里面去执行。
- step into my code(Alt+Shift+F7快捷键):在单步执行时,遇到子函数就进入并且继续单步执行,不会进入到源码中。
- step out(Shift+F8快捷键):假如进入了一个函数体中,看了两行代码,不想看了,跳出当前函数体内,返回到调用此函数的地方。
- Resume program(F9快捷键):恢复程序,直接运行到下一断点处。若无下一断点,则直接跑完程序。
一般操作步骤:设置好断点,debug运行,然后 F8单步调试,遇到想进入的函数 F7 进去,想出来在 Shift+F8,跳过不想看的地方,直接设置下一个断点,然后 F9 过去。
4.控制台各变量类型的图标
每个变量左侧的图标指示其类型。
5.Debug调试示例1
- 设置断点,debug运行
- 执行一次step into(F7快捷键)
- 执行一次step over(F8快捷键)
再执行一次step over(F8快捷键)
再执行一次step over(F8快捷键)
再执行一次step over(F8快捷键)
再执行一次step over(F8快捷键)
- 看够了循环,想直接看最终 result 加完的结果,直接在结果处打断点,执行Resume program(F9快捷键)
- 执行一次step out(Shift+F8快捷键),跳出当前函数,返回到调用此函数的地方。
- 执行一次step over(F8快捷键)
- 再执行一次step over(F8快捷键)
第一个示例就完成了!!!
6.Debug调试示例2
运行示例程序2,计算输入的不同水果的平均数量。
程序抛出一个异常,可以看到它的运行窗口中的堆栈跟踪(Traceback)。可以单击Traceback中的文件名和行号导航到编辑器。设置一个断点开始调查问题吧!!!(单击要设置断点的沟槽gutter,或者将光标插入该行并按Ctrl+F8)
开始调试程序,点击toolbar的小虫子图标,或者按Shift+F9。
想要检查函数是否发生了异常,可以计算调用这个函数的表达式。复制选定的表达式并且将其粘贴到Debug窗口Evaluate expression处。
按下Enter评估表达式。
可以看出这个表达式会导致异常,将此表达式添加到Debugger watches中,使其在将来自动计算。点击Debug窗口的图标。
为了找出导致这种异常的原因,单步执行选中的代码。(点击Debug窗口的图标,或者按F7)
注意到,有几个嵌套调用,step into之后将他们都高亮了。按←去选择
extract_number
函数,然后按Enter去单步执行。让我们来看看我们要传递给
int
的是什么。按Ctrl+Alt+F8为选中的参数调用快速求值表达式。这个函数的目的是提取数字,但是可以看到目前提取的是字符串
apple
,有一个数组索引的错误,将索引值0修改为1。重新运行我们的项目。
检查一下在修改后,调用
extract_number
是否还会抛出异常。单击step over(不进入函数的单步执行)或者按F8。可以看到调用没有抛出异常,按F9或者单击resume program(恢复程序执行,直到碰到下一个断点)。
又一次的跳到了我们设置的断点的位置,但是我们不需要停在这里了,因为这个地方的异常已经解决了。所以mute此处的断点,点击Mute Breakpoint。
最后,检查一下
find_average
的结果,首先将光标移动到return语句前,按Alt+F9执行程序到当前光标的那一行。按Ctrl+Alt+F8为选中的参数调用快速求值表达式。结果正确,结束Debug调试。
第二个示例就完成了!!!
7.Debug调试示例3
设置断点,debug运行。
console窗口用于和程序交互或者是查看程序的打印。键盘输入a的值。
现在想要进入
classify
函数中,执行一次step into(F7快捷键)或者step into my code(Alt+Shift+F7快捷键)想看一下函数内部的细节,执行两次step over(F8快捷键)
想看一下
incr_by_two()
这个函数,直接step into(F7快捷键)进去。进来又不想看这个函数了,直接step out(Shift+F8快捷键)跳出当前函数体,返回到调用此函数的地方。
想直接查看
classify
函数返回的结果,在打一个断点,然后Resume program(F9快捷键)直接运行到断点处。不想一步一步执行了,直接Resume program(F9快捷键)跑完剩余的代码。
第三个示例就完成了!!!
附录
示例程序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)
参考
😊😊😊