极度处置组件能协助他们在运转前夕处置极度重要信息,但Python标识符除了更加此基础的严重错误——句法严重错误和方式论严重错误。
句法严重错误相较单纯,在正则表达式的协助下,他们迅速就能功能定位严重错误所处。但对方式论严重错误的增容就难多了,那些句法或方式论微观的严重错误,形成了各种各样的标识符bug。
为的是增容严重错误,他们须要晓得,手忙脚乱时什么样表达式的值是恰当的,什么样表达式的值是严重错误的。因而,他们须要掌控许多标识符增容的基本上基本上功。
本序文自《Python极简短文:一两本书进阶数据挖掘与机器学习》那哥。这是两本通俗易懂、单纯易懂的Python极简短文,以掌控“最多必要性科学知识”为诗歌创作经营理念,对新手极为亲善!
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
0506 foo(0)
运转结果
n = 0
———————————————————————ZeroDivisionError Traceback (most recent call last)
……
<ipython-input-9-d21f20e5d17e> infoo(s)
2 n = int(s)
3 print(n = {}.format(n))
—-> 4 return 10 / n 5 6 def main():
ZeroDivisionError: division byzero
根据打印处的重要信息(第3行)和严重错误重要信息(division by zero),他们可以很容易地功能定位严重错误所处:标识符第4行,作为分母,n值为0。
02 assert断言
用print()检视表达式的不足之处在于,增容完毕后,他们还得手动将它们删掉,如果增容工作量较大,造成print()满天飞,删除大量print()语句的工作量也不容小觑。而且,如果程序中到处充斥着print()语句,输入重要信息也会非常繁杂,给程序员造成困扰。
因而,就有了第二种方式—断言(assert)。凡是可用print()来辅助查看的,都可以用assert来替代。它用来测试某个条件(condition)的布尔值,系统默认这个条件为真,此时断言悄然无息,他们感知不到它的存在。但是,一旦条件为假,就会触发极度。assert的句法格式如下。
assert <condition> #第二种情况,不给出严重错误重要信息
在Python中,可以把assert理解为简化版的极度处置,它与如下语句等价。
if not raise
AssertionError
assert后面也可以紧跟参数,给出更加详细的严重错误重要信息,示例如下。
assert <condition> [, arguments] #第二种情况,给出严重错误重要信息(可选项)
这种情况等价于如下语句。
if not
condition:
raiseAssertionError(arguments)
下面他们通过具体示例来说明assert的用法,见【例2】。
【例2】assert的用法(assert_no_err_msg.py)
01 def avg(score):02 assert len(score) != 003 return
sum(score) / len(score)
0405score = []
06 print(“平均分数为:”,avg(score))
运转结果
AssertionError Traceback (most recent call last
)
<ipython-input-11-56d552b0cddd> in <module>
4 5score = []
—-> 6 print(“平均分数为:”,avg(score))<ipython-input-11-56d552b0cddd>in avg(score)
1 def avg(score):
—-> 2 assert len(score) != 0 3 return sum(score)/len(score)
4 5score = []
AssertionError:
标识符分析
由于标识符的第05行是一个空列表,其长度为0,因而会让第02行的判断条件len(score) != 0 为假,这时就会触发极度,导致程序终止运转。此时,如果将第05行标识符修改如下:
05 score = [90,85,78]
整个程序将能正常运转,运转结果如下。
平均分数为: 84.33333333333333
使用assert的好处在于,当判断条件为真时,用户是感觉不到assert的,因为assert只有当判断条件为假时才“刷存在感”,给出严重错误重要信息。严重错误重要信息一旦给出,在某种程度上就功能定位了标识符的bug所处,从而达到了程序增容的目的。增容完毕后,用户无须删除assert语句。
【例2】中的assert并没有给出严重错误重要信息,可读性不强。事实上,他们还可以显式给出严重错误重要信息。他们可以如下修改【例2】的第02行标识符。
assert len(marks) != 0, “列表为空,咋整啊!”
这里,断言条件后面的”列表为空,咋整啊!”,是条件一旦为假时输入的严重错误重要信息。他们假设,此时第05行依然为空列表,这时【例2】的运转结果如下。
AssertionError Traceback (most recentcall last
)
<ipython-input-13-a477886d663d> in <module>
5score = []
6 # score = [90,85,78]—-> 7 print(“平均分数为:”,avg(score))<ipython-input-13-a477886d663d> in avg(score)
1 def avg(score):
—-> 2 assert len(score) != 0, “列表为空,咋整啊!” 3 return sum(score) / len(score)
4 5score = []
AssertionError: 列表为空,咋整啊!
很明显,有了严重错误重要信息,就更容易找到标识符的严重错误所处了。
如果断言太多,也会遭遇与print()类似的处境,极度重要信息会让他们“应接不暇”。如果不须要断言来帮忙,则在命令行启动Python正则表达式时可用“-O”参数来关闭assert,如下。
python -O assert_no_err_msg.py #选项是大写的字母O,而非数字0
除了前面提到的借助print()、assert进行增容,他们还可以使用IDE(如PyCharm等)进行增容,那些集成开发环境有着非常好用的“单步增容功能”,同时配合控制台的输入,也能比较便捷地功能定位严重错误。
当他们开发的项目规模比较大时,他们会发现,logging才是终极武器。logging是Python的日志组件。使用这个组件的好处在于,它允许他们指定记录重要信息的级别,有debug、info、warning、error等。
他们可以根据须要输入不同级别的重要信息。例如,当他们指定level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debug和info就不起作用了。这样一来,他们就不
关于这个组件的科学知识,就留给“爱折腾”读者自学吧。高手,永远都是自学出来的!
《Python极简短文:一两本书进阶数据挖掘与机器学习》是两本理论结合实战,娓娓道来的入门好书。书中提供了进阶数据科学领域的 极简必要性科学知识 !
不同于其他图书,两本书不求全,但求精。这里的“精”是指,给出进阶数据挖掘的“极简必要性科学知识”( Minimal Actionable Knowledge and Experience,MAKE )。在极短的时间内,掌控数据挖掘的MAKE之道,这是两本书的一大特色。
▊ 两本书脉络
▊ 大咖推荐
董付国,知名Python讲者、16本Python系列图书作者魏梦舒,微信高扬博士,《白话强化学习与PyTorch》作者、金山办公AI技术专家July,CSDN千万级流量博主、七月在线CEO雷明,SIGAI创始人、《机器学习:原理、算法与应用》作者、百度前高级软件工程师
热文推荐
陆奇:Chatbot将成为未来重要的人机交互窗口
