如何在 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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 华为数通hcie_通融理赔后需要签协议吗

    华为数通hcie_通融理赔后需要签协议吗Internet组管理协议称为IGMP协议(InternetGroupManagementProtocol),是因特网协议家族中的一个组播协议。该协议运行在主机和组播路由器之间。IGMP包含了IGMPv1、IGMPv2、IGMPv3三个版本,目前正处于由IGMPv2向IGMPv3的过渡阶段。本篇将按照IGMP基本原理、IGMP三个版本、IGMPSnooping几部分对IGMP协议进行介绍。

    2022年9月14日
    0
  • fastdfs 上传文件(nginx文件上传服务器)

    一、FastDFS介绍FastDFS开源地址:https://github.com/happyfish100参考:分布式文件系统FastDFS设计原理参考:FastDFS分布式文件系统1.简介FastDFS是一个开源的高性能分布式文件系统(DFS)。它的主要功能包括:文件存储,文件同步和文件访问,以及高容量和负载平衡。主要解决了海量数据存储问题,特别适合以中小文件(…

    2022年4月16日
    134
  • Maven(二):常用命令、依赖管理

    Maven(二):常用命令、依赖管理

    2021年10月5日
    32
  • shell expect使用方法「建议收藏」

    shell expect使用方法「建议收藏」Expect的作者DonLibes在1990年开始编写Expect时对Expect做有如下定义:Expect是一个用来实现自动交互功能的软件套件(Expect[isa]softwaresuiteforautomatinginteractivetools)。使用它系统管理员的可以创建脚本用来实现对命令或程序提供输入,而这些命令和程序是期望从终端(terminal)得到输入,一般来说

    2025年5月25日
    0
  • pytest fixtures_figure可数吗

    pytest fixtures_figure可数吗fixture的优势Pytest的fixture相对于传统的xUnit的setup/teardown函数做了显著的改进:命名方式灵活,不局限于setup和teardown这几个命名conf

    2022年7月28日
    3
  • 让你彻底理解浅拷贝和深拷贝的区别是什么_怎么让文件无法拷贝

    让你彻底理解浅拷贝和深拷贝的区别是什么_怎么让文件无法拷贝在写js的时候经常会遇到复制对象,在复制对象的过程中往往会出现新对象改变原对象等等的一些问题,今天特意梳理一下,希望能帮助到遇到这些问题的开发人员。什么是浅拷贝,深拷贝以及和他们之间的区别赋值浅拷贝深拷贝在开始梳理之前先说一下值类型和引用类型:值类型(基本类型):字符串(string)、数值(number)、布尔值(boolean)、undefined、null;引用类型:对象(Object)、数组(Array)、函数(Function);1、什么是浅拷贝,深拷贝以及和他们之间的区别

    2022年10月1日
    0

发表回复

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

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