某客户购买了10万元一年期收益率为3.7%的理财产品。每年理财赎回后,他会取2万作为生活所需,全下资金仍购买此种理财,在收益率不变的情况下,多少年后资金会被全部取出?
假设本金money=,第一年到期后本息合计=money*(1+3.7%),然后取出2万。很容易得出计算公式为round(money*(1+0.),2)-
重复运行上述公式,可以计算连续若干年的资金余额。
使用python3.8编写代码:
importpdbmoney=#本金year=0whilemoney0:money=round(money*(1+0.),2)-year+=1pdb.set_trace()#运行到这里会自动暂停
pdb是Python标准库的一部分,类似于其他的调试器,是独立的工具,当你需要一个调试器时,它们是不可替代的。本篇教程的最后,大家将会学习到如何使用调试器来查看应用中的任何变量,可以在任何时刻停止或恢复应用执行流程,从而了解到每行代码是如何影响应用的内部状态的。这有助于追踪难以发现的bug,并且实现快速可靠的解决缺陷代码。有时候,在pdb中单步调试代码,然后查看变量值的变化,可以有助于我们对应用代码的深层次理解。,所以只要我们使用了Python解释器,也就可以使用pdb,非常方便。
解析:importpdb引入pdb标准库,在适当时候插入pdb.set_trace()这一行,程序会自动暂停。
e:\python\work\demo\test_pdb.py(5)module()-whilemoney0:(Pdb)pyear,money(1,.0)(Pdb)ce:\python\work\demo\test_pdb.py(5)module()-whilemoney0:(Pdb)pyear,money(2,.9)(Pdb)ce:\python\work\demo\test_pdb.py(5)module()-whilemoney0:(Pdb)pyear,money(3,.39)(Pdb)q....bdb.BdbQuit
在(Pdb)调试环境中,输入p命令表示查看print,c命令表示继续运行continue,q命令表示quit退出。如上所示,使用p和c交替执行,可以查看第一年,资金为,第2年为.9
使用PDB的方式有两种:1.单步执行代码,通过命令python-mpdbxxx.py启动脚本,进入单步执行模式pdb命令行:1)进入命令行Debug模式,python-mpdbxxx.py2)h:(help)帮助3)w:(whe)打印当前执行堆栈4)d:(down)执行跳转到在当前堆栈的深一层(个人没觉得有什么用处)5)u:(up)执行跳转到当前堆栈的上一层6)b:(bak)添加断点b列出当前所有断点,和断点执行到统计次数bline_no:当前脚本的line_no行添加断点bfilename:line_no:脚本filename的line_no行添加断点bfunction:在函数function的第一条可执行语句处添加断点7)tbak:(temporarybak)临时断点在第一次执行到这个断点之后,就自动删除这个断点,用法和b一样8)cl:(clear)清除断点cl清除所有断点clbpnumber1bpnumber2...清除断点号为bpnumber1,bpnumber2...的断点cllineno清除当前脚本lineno行的断点clfilename:line_no清除脚本filename的line_no行的断点9)disable:停用断点,参数为bpnumber,和cl的区别是,断点依然存在,只是不启用10)enable:激活断点,参数为bpnumber11)s:(step)执行下一条命令如果本句是函数调用,则s会执行到函数的第一句12)n:(next)执行下一条语句如果本句是函数调用,则执行函数,接着执行当前执行语句的下一条。13)r:(turn)执行当前运行函数到结束14)c:(continue)继续执行,直到遇到下一条断点15)l:(list)列出源码l列出当前执行语句周围11条代码lfirst列出first行周围11条代码lfirstsecond列出first--second范围的代码,如果secondfirst,second将被解析为行数16)a:(args)列出当前执行函数的函数17)pexpssion:(print)输出expssion的值18)ppexpssion:好看一点的pexpssion19)run:重新启动debug,相当于start20)q:(quit)退出debug21)jlineno:(jump)设置下条执行的语句函数只能在堆栈的最底层跳转,向后重新执行,向前可直接执行到行号22)unt:(until)执行到下一行(跳出循环),或者当前堆栈结束23)conditionbpnumberconditon,给断点设置条件,当参数condition返回True的时候bpnumber断点有效,否则bpnumber断点无效注意:1:直接输入Enter,会执行上一条命令;2:输入PDB不认识的命令,PDB会把他当做Python语句在当前环境下执行;
自从Python3.7以来,官方标准建议使用标准库内部函数bakpoint()替代上面的代码(注意:本文附带的代码都使用的上面代码形式),这样可以更加加快解释器的运行和调试:
默认情况下,bakpoint()将会导入pdb模块,然后调用pdb.set_trace()函数,只是它进行了进一步封装。但是,使用bakpoint()可以更加灵活,并且允许用户通过调用它的API来控制调试行为,以及使用环境变量PYTHONBREAKPOINT。例如,当我们设置PYTHONBREAKPOINT=0在我们的环境中,这就会完全关闭bakpoint()的功能,从而关闭调试功能。
以上示例仅为演示。如果使用循环结构,可以轻松解决开篇的问题
money=#本金year=0whilemoney0:money=round(money*(1+0.),2)-year+=1print(year,money)
程序自动计算结果:
可以直观看到第5年资金仅有.7,第6年已经不够2万生活费了。