如何在 Python 中使用断点调试

如何在 Python 中使用断点调试实际上没人能一次就写出完美的代码,除了我。但是世界上只有一个我。–林纳斯·托瓦兹(Linux之父) 既然不是神,写代码自然免不了要修改。修改代码的过程被称作调试,又叫 debug。 刚接触编程的人,往往对调试代码没有很深的认识,觉得把功能做出来就完事了。一旦程序运行出现问题,便无从下手。而实际开发中,调试代码通常要花费比新编写代码更多的时间。所谓“行百里者半于九十”,这句…

大家好,又见面了,我是你们的朋友全栈君。

实际上没人能一次就写出完美的代码,除了我。但是世界上只有一个我。

— 林纳斯·托瓦兹(Linux 之父)

 

既然不是神,写代码自然免不了要修改。修改代码的过程被称作调试,又叫 debug。

 

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

 

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

 

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

 

以下面这段代码为例:

 

def twice(n):

    n *= 2

    return n

 

a = input(“a:”)

b = input(“b:”)

if a > 3:

    b += 4

    if b > 5:

        c = a + twice(b)

    else:

        c = twice(a) + b

else:

    b -= 2

    if b < 1:

        c = a – twice(b)

    else:

        c = twice(a) – b

print c

 

即使这样不长的一段代码,如果对于某些输入,最后输出的值和你的预期不一致,想要用肉眼从中看出到底哪里出了问题也并不是一目了然的事情。

 

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

 

def twice(n):

    n *= 2

    return n

 

a = input(“a:”)

b = 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

 

运行后的效果:

 

a:2

b:4

====a,b: 2 4

====2 b: 2

====4 c: 2

2

 

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

 

 

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

 

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

 

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

 

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

 

如何在 Python 中使用断点调试

 

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

 

选择 debug,程序开始运行。

 

如何在 Python 中使用断点调试

 

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

 

如何在 Python 中使用断点调试

 

选择“resume program”,程序就会继续执行,直到遇到下一个断点。

 

如何在 Python 中使用断点调试

 

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

 

 

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

 

如何在 Python 中使用断点调试

 

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

 

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

 

如何在 Python 中使用断点调试

 

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

 

如何在 Python 中使用断点调试

 

 

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

 

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

 

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

 

没有捷径。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143299.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux 查看pid占用的端口_如何通过端口号查进程

    linux 查看pid占用的端口_如何通过端口号查进程Linux查看Java进程PID、端口号和内存占用脚本Linux查看Java进程PID、端口号和内存占用脚本背景查询PID查询占用端口查询内存占用百分比脚本使用背景正常情况下,一个jps-ml就可以查看机器上有多少Java进程以及它们的PID,如果还要看端口号,甚至内存占用,就还要配合netstat以及ps等查询,如果直接使用一个命令就能查出所有信息多…

    2022年8月23日
    8
  • 数据结构之哈希表(hash)代码

    哈希的关键在于算法,呵呵,我这算法,不说了,见笑了。哈希在内核中用得非常之广,准确来说是链表,下面是一个相对简单的例子,希望能对大家理解hash有些帮助。/************************************************************************************************************** **文

    2022年4月8日
    83
  • matlab多重比较lsd法,多重比较LSD-t值的计算(附证明方法)

    matlab多重比较lsd法,多重比较LSD-t值的计算(附证明方法)多重比较LSD-t值的计算问题的提出:向学术期刊投稿时,“变态”的审稿人向你“索要”LSD-t值,可是SPSS的输出结果中没有这个值——是不是有点悲催?!另外,大家还会有一个常见的疑问:采用LSD-t法进行两两比较之后得出来的p值,需不需要调整显著性水平?我们先把原始数据和答案给出来,然后再讲一讲其中的数理逻辑。本例使用的原始数据如下图所示,有兴趣的读者可以用本数据进行对照学习(本例采用单因素方差…

    2022年6月12日
    45
  • kali Linux开启ssh服务

    kali Linux开启ssh服务目的 本地 xshell 连接 KaliLinux 步骤 1 修改 kaliLinux 的配置文件 vim etc ssh sshd config 进入配置文件去掉 PasswordAuth 前的 号 且后面跟 yes 去掉 PermitRootLo 前的 号 且后面跟 yes 2 开启 ssh 服务 servicesshst 关闭服务查看状态 servicesshst xshel

    2025年9月5日
    3
  • 高德定位SDK_高德地图api使用教程

    高德定位SDK_高德地图api使用教程1.LocationManagerProxy获取当前Context创建一个LocationManagerProxy变量mAMapLocManager=LocationManagerProx

    2022年8月1日
    11
  • sendto & recvfrom 详解

    sendto & recvfrom 详解参考一:sendto和recvfrom一般用于UDP协议中,但是如果在TCP中connect函数调用后也可以用.sendto()和recvfrom()——利用数据报方式进行数据传输 1.在无连接的数据报socket方式下,由于本地socket并没有与远端机器建立连接,所以在发送数据时应指明目的地址,sendto()函数原型为:   intsendto(intsockf

    2022年7月23日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号