初学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
---------------------------------------------------------------------------------
关注微信公众号即可在手机上查阅,并可接收更多测试分享~