脚本主页
您加入数百万开发者行列
异常处理模块可以帮助我们处理运行时的异常信息,但是代码中还有更基本的错误——语法错误和逻辑错误。
语法错误比较简单,借助解释器,我们可以快速定位错误。但调试逻辑错误要困难得多。这些语法或逻辑错误构成了各种代码错误。
为了调试错误,我们需要知道错误发生时哪些变量具有正确的值,哪些变量具有错误的值。因此,我们需要掌握一些代码调试的基本技巧。
本文节选自《极简讲义:一本书介绍数据分析和机器学习》一书。这是一本极简主义的讲义,图片和文字丰富,易于阅读。它以掌握“最少必要知识”为写作理念,对初学者非常友好!
01 使用print()输出观察变量
第一种方法,简单有效,直接粗暴,就是使用print()打印出需要观察的变量,如下所示。
【示例1】print()输出观察变量(print-err.py)
01 def foo(s):
02 n = int(s) #字符串转换为整型
03 print('n = {}'.format(n)) #输出观察变量n的值
04 return 10 / n
05
06 foo('0')
运行结果
n = 0
---------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
……input -9-d21f20e5d17e> in foo(s)
2 n = int(s)
3 print('n = {}'.format(n))
----> 4 return 10 / n
5
6 def main():
ZeroDivisionError: division by zero
根据打印信息(第3行)和错误信息(按零),我们可以很容易定位到错误所在:代码第4行,作为分母,n值为0。
02 断言
使用print()来观察变量的缺点是调试后我们必须手动删除它们。如果调试工作量很大,而且print()到处都是,删除大量print()语句的工作量也不会小。留意。而且,如果程序中充满了print()语句,输出的信息将会非常复杂,给程序员带来麻烦。
因此,就有了第二种方法——()。任何可以使用 print() 查看的内容都可以使用。用于测试某个条件()的布尔值。系统默认将此条件视为 true。此时断言是无声的,我们无法感知到它的存在。然而,一旦条件变为假,就会触发异常。语法格式如下。
assert
#第一种情况,不给出错误信息
中,可以理解为异常处理的简化版,相当于下面的语句。
if not
raise AssertionError
它还可以跟随参数以提供更详细的错误信息。示例如下。
assert
[, arguments] #第二种情况,给出错误信息(可选项)
这种情况相当于下面的语句。
if not condition:
raise AssertionError(arguments)
下面我们通过具体例子来说明用法,参见【例2】。
[示例2]用法(.py)
01 def avg(score):
02 assert len(score) != 0
03 return sum(score) / len(score)
04
05 score = []
06 print("平均分数为:",avg(score))
运行结果
AssertionError Traceback (most recent call last)
input -11-56d552b0cddd> in <module>
4
5 score = []
----> 6 print("平均分数为:",avg(score))input-11-56d552b0cddd> in avg(score)
1 def avg(score):
----> 2 assert len(score) != 0
3 return sum(score)/len(score)
4
5 score = []
AssertionError:
代码分析
由于代码第05行是一个长度为0的空列表,因此第02行的判断条件len(score) != 0将会为false,并会触发异常,导致程序终止。此时如果将第05行代码修改如下:
05 score = [90,85,78]
整个程序会正常运行,结果如下。
平均分数为: 84.33333333333333
使用它的好处是,当判断条件为真时,用户感觉不到,因为只有当判断条件为假时,“存在感”才会被“刷新”,并给出错误信息。一旦给出错误信息,就可以在一定程度上定位到代码中的bug,从而达到程序调试的目的。调试完成后,用户无需删除该语句。
[示例2]没有给出错误消息并且可读性不是很好。事实上,我们也可以明确地给出错误信息。我们可以将[示例2]的第02行修改如下。
assert len(marks) != 0, "列表为空,咋整啊!"
这里,“列表是空的,我该怎么办?”断言条件后面是条件为假时输出的错误消息。我们假设此时第05行仍然是一个空列表。此时【例2】的运行结果如下。
AssertionError Traceback (most recent call last)
input -13-a477886d663d> in <module>
5 score = []
6 # score = [90,85,78]
----> 7 print("平均分数为:",avg(score))input-13-a477886d663d> in avg(score)
1 def avg(score):
----> 2 assert len(score) != 0, "列表为空,咋整啊!"
3 return sum(score) / len(score)
4
5 score = []
AssertionError: 列表为空,咋整啊!
显然,有了错误消息,就更容易找到代码哪里出错了。
如果断言太多,我们就会遇到类似print()的情况,我们会被异常信息“淹没”。如果不需要断言来帮助,可以在从命令行启动解释器时使用“-O”参数将其关闭,如下所示。
python -O assert_no_err_msg.py #选项是大写的字母O,而非数字0
除了前面提到的使用 print() 进行调试外,我们还可以使用 IDE(如等)进行调试。这些集成开发环境都有一个非常好用的“单步调试功能”。同时结合控制台的输出,更容易定位错误。
当我们开发的项目规模比较大的时候,我们会发现它就是终极武器。是的日志记录模块。使用该模块的好处是它允许我们指定日志信息的级别,包括debug、info、error等。
我们可以根据需要输出不同级别的信息。例如,当我们指定 level=INFO 时,.debug 不起作用。同理,指定level=后,debug和info就不起作用了。这样,我们就不用担心过多的输出信息会稀释注意力。
该模块的知识就留给《爱折腾》读者自行学习。大师都是自学成才的!
相关书籍
《极简讲义:数据分析与机器学习入门书》是一本很好的入门书,理论联系实际,讲解得深入浅出。本书提供了数据科学领域入门所需的极简知识!
与其他书不同,本书不求完美,而是求精。这里的“精”是指入门级数据分析的“极简必备知识”(以及MAKE)。在很短的时间内掌握数据分析的MAKE方法是本书的一大特色。
▊ 本书的背景
▊ 大牌推荐
祝福
利润
来
知道了
小编为我们爱读书的书友赠送免费书籍。
留言、点赞、送书规则
留言点赞:留言分享你在学习或者使用开发过程中的学习心得,或者其他一些学习心得。
>>>活动参与
玩法一:机会永远是自己争取的!编辑会选择评论,页面上会显示选中的评论(由于微信功能限制,最多只能显示100条)。活动结束点赞数最多的前2名好友将获得纸质版《极简讲义:数据分析与机器学习入门书籍》。
玩法2:踩在地板上送书。活动结束,踩到百度云文件中指定楼层已投放的精选留言,即可获得《极简讲义:数据分析与机器学习入门书籍》一本,共3人获奖,我们将在活动结束后在本公众号公布获奖楼层的解压密码。
中奖楼层下载地址(文件解压密码将在2020年5月12日推送的中奖文章中公布)
百度云链接:
提取码:kx5h
特别声明:
1. 一名用户一个月内只能有一次获奖机会。让更多粉丝受益更有意义。
2.每个用户只有一次留言机会,不允许重复留言~
请记住这三个1
活动截止时间:2020年5月12日16:00整。
只需点击所选书籍的蓝色字母即可
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。