百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

python使用pdb调试器来调试程序

yuyutoo 2025-01-14 18:39 4 浏览 0 评论

某客户购买了10万元一年期收益率为3.7%的理财产品。每年理财赎回后,他会取2万作为生活所需,全下资金仍购买此种理财,在收益率不变的情况下,多少年后资金会被全部取出?

假设本金money=100000,第一年到期后本息合计=money*(1+3.7%),然后取出2万。很容易得出计算公式为round(money*(1+0.037),2)-20000

重复运行上述公式,可以计算连续若干年的资金余额。

使用python3.8编写代码:

import pdb

money=100000 #本金
year=0
while money>0:
   money=round(money*(1+0.037),2)-20000
   year+=1
   pdb.set_trace() #运行到这里会自动暂停

pdb是Python标准库的一部分,类似于其他的调试器,是独立的工具,当你需要一个调试器时,它们是不可替代的。本篇教程的最后,大家将会学习到如何使用调试器来查看应用中的任何变量,可以在任何时刻停止或恢复应用执行流程,从而了解到每行代码是如何影响应用的内部状态的。这有助于追踪难以发现的bug,并且实现快速可靠的解决缺陷代码。有时候,在pdb中单步调试代码,然后查看变量值的变化,可以有助于我们对应用代码的深层次理解。,所以只要我们使用了Python解释器,也就可以使用pdb,非常方便。

解析:import pdb引入pdb标准库,在适当时候插入pdb.set_trace()这一行,程序会自动暂停。

> e:\python\work\demo\test_pdb.py(5)<module>()
-> while money>0:
(Pdb) p year,money
(1, 83700.0)
(Pdb) c
> e:\python\work\demo\test_pdb.py(5)<module>()
-> while money>0:
(Pdb) p year,money
(2, 66796.9)
(Pdb) c
> e:\python\work\demo\test_pdb.py(5)<module>()
-> while money>0:
(Pdb) p year,money
(3, 49268.39)
(Pdb) q
....
bdb.BdbQuit

在(Pdb)调试环境中,输入p 命令表示查看print,c命令表示继续运行continue,q命令表示quit退出。如上所示,使用p和c交替执行,可以查看第一年,资金为83700,第2年为66796.9

使用PDB的方式有两种:
1. 单步执行代码,通过命令 python -m pdb xxx.py 启动脚本,进入单步执行模式
 pdb命令行:
    1)进入命令行Debug模式,python -m pdb xxx.py
    2)h:(help)帮助
    3)w:(where)打印当前执行堆栈
    4)d:(down)执行跳转到在当前堆栈的深一层(个人没觉得有什么用处)
    5)u:(up)执行跳转到当前堆栈的上一层
    6)b:(break)添加断点
                 b 列出当前所有断点,和断点执行到统计次数
                 b line_no:当前脚本的line_no行添加断点
                 b filename:line_no:脚本filename的line_no行添加断点
                 b function:在函数function的第一条可执行语句处添加断点
    7)tbreak:(temporary break)临时断点
                 在第一次执行到这个断点之后,就自动删除这个断点,用法和b一样
    8)cl:(clear)清除断点
                cl 清除所有断点
                cl bpnumber1 bpnumber2... 清除断点号为bpnumber1,bpnumber2...的断点
                cl lineno 清除当前脚本lineno行的断点
                cl filename:line_no 清除脚本filename的line_no行的断点
    9)disable:停用断点,参数为bpnumber,和cl的区别是,断点依然存在,只是不启用
    10)enable:激活断点,参数为bpnumber
    11)s:(step)执行下一条命令
                如果本句是函数调用,则s会执行到函数的第一句
    12)n:(next)执行下一条语句
                如果本句是函数调用,则执行函数,接着执行当前执行语句的下一条。
    13)r:(return)执行当前运行函数到结束
    14)c:(continue)继续执行,直到遇到下一条断点
    15)l:(list)列出源码
                 l 列出当前执行语句周围11条代码
                 l first 列出first行周围11条代码
                 l first second 列出first--second范围的代码,如果second<first,second将被解析为行数
    16)a:(args)列出当前执行函数的函数
    17)p expression:(print)输出expression的值
    18)pp expression:好看一点的p expression
    19)run:重新启动debug,相当于restart
    20)q:(quit)退出debug
    21)j lineno:(jump)设置下条执行的语句函数
                只能在堆栈的最底层跳转,向后重新执行,向前可直接执行到行号
    22)unt:(until)执行到下一行(跳出循环),或者当前堆栈结束
    23)condition bpnumber conditon,给断点设置条件,当参数condition返回True的时候bpnumber断点有效,否则bpnumber断点无效
 
注意:
    1:直接输入Enter,会执行上一条命令;
    2:输入PDB不认识的命令,PDB会把他当做Python语句在当前环境下执行;

自从Python3.7以来,官方标准建议使用标准库内部函数breakpoint()替代上面的代码(注意:本文附带的代码都使用的上面代码形式),这样可以更加加快解释器的运行和调试:

默认情况下,breakpoint()将会导入pdb模块,然后调用pdb.set_trace()函数,只是它进行了进一步封装。但是,使用breakpoint()可以更加灵活,并且允许用户通过调用它的API来控制调试行为,以及使用环境变量PYTHONBREAKPOINT。例如,当我们设置PYTHONBREAKPOINT=0在我们的环境中,这就会完全关闭breakpoint()的功能,从而关闭调试功能。

以上示例仅为演示。如果使用循环结构,可以轻松解决开篇的问题

money=100000 #本金
year=0
while money>0:
   money=round(money*(1+0.037),2)-20000
   year+=1  
   print(year,money)

程序自动计算结果:

可以直观看到第5年资金仅有12241.7,第6年已经不够2万生活费了。

相关推荐

史上最全的浏览器兼容性问题和解决方案

微信ID:WEB_wysj(点击关注)◎◎◎◎◎◎◎◎◎一┳═┻︻▄(页底留言开放,欢迎来吐槽)●●●...

平面设计基础知识_平面设计基础知识实验收获与总结
平面设计基础知识_平面设计基础知识实验收获与总结

CSS构造颜色,背景与图像1.使用span更好的控制文本中局部区域的文本:文本;2.使用display属性提供区块转变:display:inline(是内联的...

2025-02-21 16:01 yuyutoo

写作排版简单三步就行-工具篇_作文排版模板

和我们工作中日常word排版内部交流不同,这篇教程介绍的写作排版主要是用于“微信公众号、头条号”网络展示。写作展现的是我的思考,排版是让写作在网格上更好地展现。在写作上花费时间是有累积复利优势的,在排...

写一个2048的游戏_2048小游戏功能实现

1.创建HTML文件1.打开一个文本编辑器,例如Notepad++、SublimeText、VisualStudioCode等。2.将以下HTML代码复制并粘贴到文本编辑器中:html...

今天你穿“短袖”了吗?青岛最高23℃!接下来几天气温更刺激……

  最近的天气暖和得让很多小伙伴们喊“热”!!!  昨天的气温到底升得有多高呢?你家有没有榜上有名?...

CSS不规则卡片,纯CSS制作优惠券样式,CSS实现锯齿样式

之前也有写过CSS优惠券样式《CSS3径向渐变实现优惠券波浪造型》,这次再来温习一遍,并且将更为详细的讲解,从布局到具体样式说明,最后定义CSS变量,自定义主题颜色。布局...

柠檬科技肖勃飞:大数据风控助力信用社会建设

...

你的自我界限够强大吗?_你的自我界限够强大吗英文

我的结果:A、该设立新的界限...

行内元素与块级元素,以及区别_行内元素和块级元素有什么区别?

行内元素与块级元素首先,CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,分别为块级(block)、行内(inline)。块级元素:(以下列举比较常...

让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华
让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华

去年的两会期间,习近平总书记在参加人大会议四川代表团审议时,对治蜀兴川提出了明确要求,指明了前行方向,并带来了“祝四川人民的生活越来越安逸”的美好祝福。又是一年...

2025-02-21 16:00 yuyutoo

今年国家综合性消防救援队伍计划招录消防员15000名

记者24日从应急管理部获悉,国家综合性消防救援队伍2023年消防员招录工作已正式启动。今年共计划招录消防员15000名,其中高校应届毕业生5000名、退役士兵5000名、社会青年5000名。本次招录的...

一起盘点最新 Chrome v133 的5大主流特性 ?

1.CSS的高级attr()方法CSSattr()函数是CSSLevel5中用于检索DOM元素的属性值并将其用于CSS属性值,类似于var()函数替换自定义属性值的方式。...

竞走团体世锦赛5月太仓举行 世界冠军杨家玉担任形象大使

style="text-align:center;"data-mce-style="text-align:...

学物理能做什么?_学物理能做什么 卢昌海

作者:曹则贤中国科学院物理研究所原标题:《物理学:ASourceofPowerforMan》在2006年中央电视台《对话》栏目的某期节目中,主持人问过我一个的问题:“学物理的人,如果日后不...

你不知道的关于这只眯眼兔的6个小秘密
你不知道的关于这只眯眼兔的6个小秘密

在你们忙着给熊本君做表情包的时候,要知道,最先在网络上引起轰动的可是这只脸上只有两条缝的兔子——兔斯基。今年,它更是迎来了自己的10岁生日。①关于德艺双馨“老艺...

2025-02-21 16:00 yuyutoo

取消回复欢迎 发表评论: