社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

如何在 Python 中使用断点调试

Crossin的编程教室 • 3 年前 • 1149 次点击  

入门教程、案例源码、学习资料、读者群

请访问: python666.cn

实际上没人能一次就写出完美的代码,除了我。但是世界上只有一个我。
林纳斯·托瓦兹(Linux 之父)

大家好,欢迎来到 Crossin的编程教室 !


上面这段话出自 Linux 的创造者 Linus Torvalds。既然我们都不是神,写代码自然免不了要修改。修改代码的过程被称作调试,又叫 debug。


刚接触编程的人,往往对调试代码没有很深的认识,觉得把功能做出来就完事了。一旦程序运行出现问题,便无从下手。而实际开发中,调试代码通常要花费比新编写代码更多的时间。所谓“行百里者半于九十”,这句话放在软件开发上一点不为过。你以为完成了 90% 开发工作的时候,剩下的工作可能还要花费差不多的时间。


因此,选择合理的调试方法和工具,对于开发来说意义重大。


在写 Python 代码的时候,我习惯的调试方法很简单,就是在程序里增加输出,以便了解程序的运行路径和变量的值。


以下面这段代码为例:

def twice(n):    n *= 2    return n
a = int(input("a:"))b = int(input("b:"))if a > 3: b += 4 if b > 5: c = a + twice(b) else: c = twice(a) + belse: b -= 2 if b < 1: c = a - twice(b) else: c = twice(a) - bprint(c)
即使这样不长的一段代码,如果对于某些输入,最后输出的值和你的预期不一致,想要用肉眼从中看出到底哪里出了问题也并不是一目了然的事情。

于是我会添加一些辅助的代码:

def twice(n):    n *= 2    return n
a = int(input("a:"))b = int(input("b:"))print("====a,b:", a, b)if a > 3: b += 4 print("====1 b:", b) if b > 5: c = a + twice(b) print("====1 c:", c) else: c = twice(a) + b print("====2 c:", c)else: b -= 2 print("====2 b:", b) if b < 1: c = a - twice(b) print("====3 c:", c) else: c = twice(a) - b print("====4 c:" , c)print(c)
运行后的效果:

通过添加类似的输出内容,就能比较清晰地了解程序的运行状态。


不过,直接通过输出来调试,有时候会需要一点经验判断,决定在哪里输出什么数据。尤其当程序复杂之后,需要参考的数值会很多,全部都输出会很繁琐。


一种更便捷更直观的方式就是使用断点调试


断点(break point)是指在代码中指定位置,当程序运行到此位置时变中断下来,并让开发者可查看此时各变量的值。因断点中断的程序并没有结束,可以选择继续执行。

实现断点调试需要 IDE 的支持。下面以 PyCharm 来演示一下,仍然是前面的代码:

在某一行代码的左侧栏点击,就可以在这行增加断点。现在在 3 个 if 判断的地方都加上断点。


选择 debug,程序开始运行。

输入 a、b 两个值之后,程序就在第一个 if 处中断,并且在工具栏中显示出当前程序中的各种数值。


点击工具栏侧面的“resume program”按钮,程序就会继续执行,直到遇到下一个断点。


有了断点功能的帮助,调试的时候就方便许多,很容易观察程序运行时的状态。


在断点调试时,还有个经常一起使用的功能就是单步调试


在程序中断时,选择“Step Over”,会向下执行一行代码后继续中断。


当所处代码行中有函数时,“Step Into”会中断在函数内部,之后将在其中单步执行。对应的,“Step Out”将中断在执行完当前所在函数后的位置。


这些操作在工具栏有快捷按钮,也可通过快捷键操作。



“工欲善其事,必先利其器”。把上述调试工具熟悉之后,对你的开发效率将会有很大提升。


当然,比调试工具更重要的,还是调试的思路。遇到错误时,读懂报错信息,分析出错原因,并逐步定位问题所在,而不是盲目地修改代码、无意义地重复运行,才是解决问题的关键。具体可以参考我们上次的文章:


新手上路,如何debug调试程序?


之后会继续跟大家分享调试代码的经验,这些经验都是一行行代码积累出来的。不过我的经验终究是我的经验,要把它变成你的经验,仍然需要经过一行行代码的磨练。


没有捷径。




Crossin的新书码上行动:零基础学会PYTHON编程(CHATGPT版)已经上市了

本书力求做到浅显易懂,让完全没有编程经验的零基础“小白”也能学会Python。内容从环境搭建这种最基础的步骤开始讲起,逐渐深入到常见的实际应用当中。在讲解知识点的同时配有相应的代码示例,让读者可以边学边练加深理解。

全书涵盖Python环境搭建、基础语法、常见数据类型、实用模块、正则表达式、面向对象编程、多任务编程等知识点。另外还提供了爬虫、GUI、游戏三个实战项目。

书中还创新地使用 ChatGPT 作为编程学习的辅助,带领读者探索AI时代下学习编程的新模式。
目前京东618活动正在进行中,购买本书可享5折优惠。

公众号的读者朋友们购买后可在后台联系我,加入读者交流群,Crossin会为你开启陪读模式,解答你在阅读本书时的一切疑问。


感谢转发点赞的各位~

_往期文章推荐_

用ChatGPT写一个数据采集程序




如需了解付费精品课程教学答疑服务
请在Crossin的编程教室内回复: 666

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/155868