如何在 Python 中使用断点调试

news2024/11/18 1:43:07

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

请访问: 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) + 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 = 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)

运行后的效果:

7a5c3392bd5166eac8f103f86528eb59.png

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

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

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

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

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

b72448369019a4b5bd1632007cff1695.png

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

选择 debug,程序开始运行。

ce260e0a760de76da12c6702bc2409c6.png

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

70af9d70ad7399891a32b578209834d1.png

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

0b89c52fe8ba077978b5d288721a4c63.png

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

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

cc77af44c48f2998cbe78efc61f1c982.png

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

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

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

59bc51b0943c4c010af09a77dfa4a20c.png

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

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

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

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

没有捷径。


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

af0de55265c6ccb90f9246ef89746d05.jpeg

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

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

书中还创新地使用 ChatGPT 作为编程学习的辅助,带领读者探索AI时代下学习编程的新模式。

目前京东618活动正在进行中,购买本书可享5折优惠。

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

感谢转发点赞的各位~


_往期文章推荐_

用ChatGPT写一个数据采集程序


如需了解付费精品课程教学答疑服务

请在Crossin的编程教室内回复: 666

f67dcb349deadd16f6f97bb41cb5b9cb.jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/604563.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CSS3系列】第二章 · CSS3 新增盒模型和背景属性

写在前面 Hello大家好&#xff0c; 我是【麟-小白】&#xff0c;一位软件工程专业的学生&#xff0c;喜好计算机知识。希望大家能够一起学习进步呀&#xff01;本人是一名在读大学生&#xff0c;专业水平有限&#xff0c;如发现错误或不足之处&#xff0c;请多多指正&#xff0…

大数据:数据表操作,分区表,分桶表,修改表,array,map, struct

大数据&#xff1a;数据表操作&#xff0c;分区表 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle&a…

【能量算子】评估 EEG 中的瞬时能量:非负、频率加权能量算子(PythonMatlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

五种方法提升Midjourney的出图品质

本文基于B站UP主琥珀川Eric的《五种方法提升Midjourney出图品质》制作在此感谢大神的分享。 本文全面介绍以上五种提升Midjourney出图品质的方法&#xff0c;简单实用&#xff0c;马上就可以用上。Lets go&#xff01;&#xff01;&#xff01; 方法一 使用相机参数创建逼真的图…

windows系统编译的Qt程序转到国产化麒麟linux中编译

团队自研股票软件&#xff0c;关威信共总号&#xff1a;QStockView&#xff0c;下载 1.1 windows系统编译的Qt程序转到国产化麒麟linux中编译 &#xff08;1&#xff09;把Vs工程项目文件导入到Linux中 首先把vs的工程拷贝到linux里面&#xff08;可以用虚拟机的共享文件夹…

适配器模式的学习与使用

1、适配器模式的学习 当我们需要将一个类的接口转换成另一个客户端所期望的接口时&#xff0c;适配器模式&#xff08;Adapter Pattern&#xff09;可以派上用场。它允许不兼容的接口之间能够协同工作。   适配器模式属于结构型设计模式&#xff0c;它包含以下几个角色&#…

2、数据库:SQL Server部署 - 系统部署系列文章

对于微软的SQL Server的安装&#xff0c;以前已经有写过了&#xff0c;到了2022版本&#xff0c;安装没多大的改变&#xff0c;很多只需要少配置&#xff0c;然后直接下一步即可。现在是2023年了&#xff0c;SQL Server已经出到了2022版本&#xff0c;这篇博文就再次对SQL Serv…

chatgpt赋能python:Python列表按长度排序的方法

Python列表按长度排序的方法 在Python编程中&#xff0c;列表是最常用的数据结构之一。列表是一种可变的有序序列&#xff0c;可以包含任意类型的对象。有时候&#xff0c;我们需要对列表按照元素的长度进行排序。本文将介绍Python中列表按长度排序的两种方法。 方法一&#…

pytorch实战 -- 神经网络

softmax的基本概念 交叉熵损失函数 模型训练和预测 在训练好softmax回归模型后&#xff0c;给定任一样本特征&#xff0c;就可以预测每个输出类别的概率。通常&#xff0c;我们把预测概率最大的类别作为输出类别。如果它与真实类别&#xff08;标签&#xff09;一致&#xff0…

chatgpt赋能python:Python列表排序详解:从基础排序到高级算法

Python 列表排序详解&#xff1a;从基础排序到高级算法 在 Python 编程中&#xff0c;列表是常用的数据类型。列表的排序是其中重要的操作之一。Python 提供了多种方法来对列表进行排序&#xff0c;从简单的基础排序到高级的算法排序。在这篇文章中&#xff0c;我们将详细介绍…

找到 FSM 的区别序列、UIO 或特征集(W方法)

找到 FSM 的区别序列、UIO 或特征集(W方法) 1 简介 许多系统都是基于状态的&#xff1a;它们有一个更新的内部状态通过操作并影响行为。 在测试这样一个系统时&#xff0c;一个需要考虑状态。 这导致了一系列的语言&#xff0c;用于描述基于状态的规范和模型&#xff0c;这些可…

并发编程-系统学习篇

并发编程的掌握过程并不容易。 我相信为了解决这个问题&#xff0c;你也听别人总结过&#xff1a;并发编程的第 一原则&#xff0c; 那就是不要写并发程序 这个原则在我刚毕业的那几年曾经是行得通的&#xff0c;那个时候多核服务器还是一种奢侈品&#xff0c;系统的并发量也很…

沙盒不再高端,Windows11将自带沙盒让程序检测更方便

Windows 沙盒提供了轻型桌面环境&#xff0c;可以安全地在隔离状态下运行应用程序。 安装在 Windows 沙盒环境下的软件保持“沙盒”状态&#xff0c;并且与主机分开运行。 沙盒是临时的。 当关闭沙盒后&#xff0c;系统将删除所有软件和文件以及状态。 每次使用时&#xff0c;…

AWK常用用法

awk简介 awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言&#xff1a; AWK 程序设计语言 &#xff0c; 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序&#xff0c;…

解决一个典型的商业案例研究任务

介绍 印尼的一家公司 Gojek 通过移动应用程序提供运输和物流、食品和购物、支付、日常需求、商业、新闻和娱乐等服务&#xff0c;对经济做出了超过70亿美元的贡献。 它拥有 90 万注册商户、超过 1.9 亿次应用下载以及超过 200 万名司机能够在120分钟内完成超过18万个订单。我们…

chatgpt赋能python:Python创建界面的重要性及实现方法

Python创建界面的重要性及实现方法 作为一名有10年Python编程经验的工程师&#xff0c;我深知Python在Web开发、数据分析和人工智能等方面的强大表现。然而&#xff0c;Python对于前端的支持一直是一个不被关注的领域。 随着网站、移动应用和电脑软件的普及&#xff0c;用户对…

Find My产品|Targus推出最新支持苹果Find My双肩包

Targus宣布推出 Cypress Hero Backpack 双肩包&#xff0c;最大的亮点在于支持苹果“Find My”&#xff0c;在丢失后可定位追踪。 Targus这款双肩包采用了环保材料&#xff0c;可以妥善地保护笔记本电脑&#xff0c;并提供丰富的收纳袋存放各种配件和物品。这款双肩包内置带衬…

Unity Addressables学习笔记(3)---加载远程场景Scenes

前言 Unity Addressables学习笔记—汇总 正文 1.创建一个新场景 我是创建在Resources/Scenes目录下&#xff0c;如图&#xff1a; 2.为场景创建一个Addressables的Group Game1Group就是我新创建的一个Group用来存放场景1的所有资源&#xff0c;分组的配置跟Remote一样&a…

vue 读取本地文件

1. vue读取本地文件 2.在文件夹下添加一个类 3.读取本地文件&#xff0c;先读取文件的内容 4.在 body下添加一个属性 5.读取后&#xff0c;写到 setTimeout方法中&#xff0c;返回一个错误信息。 6. restart方法&#xff0c;在组件渲染时调用 7. return setTimeout &#xff08…

使用Redis的zset集合实现小程序的滚动分页

一、 Redis中&#xff0c;使用有序集合&#xff08;sorted set&#xff09;实现滚动分页的原理如下&#xff1a; 将每个文档的 score 值设置为时间戳&#xff08;或根据其他规则计算的分数&#xff09;&#xff0c;将文档的 ID 作为 value&#xff0c;然后将其添加到有序集合中…