debug是码农们的基本技能,每个人都有自己擅长(习惯)的debug手段,比如虾神年轻的时候,曾经在ms-dos平台上写过几行C语言代码,那个时代,IDE是这个样子的:
在这种IDE下面,debug是一种极度痛苦的事情,所以就养成了print调试的习惯:所有的编程语言debug手段,都基于这两种:比如虾神才毕业的时候,还写过几天javascript,那个时代没有专用的IDE,也没有专用的JS调试工具,所以调试的时候,满页面写满alert……后来,到了写Python的时候,各种IDE已经很成熟了,但是一直养成习惯,老让我不自觉的时候在debug的时候,写满了print,然后打包发布的时候,清理代码搞得焦头烂额。一般来说,调试还是通过IDE进行断点步进,效率是最高的,效果也是最好,但是,很多时候,print有着不可替代的作用,比如远程在linux上用过shell调试Python脚本的时候;又如在jupyter notebook需要进行调试的时候;再如用Pandas的apply函数的时候;断点都不用好,更不用说,多线程编程的时候,断点调试基本上就是被废掉了。直到我后面发现了一个Python的debug神包:pysnooper。可能老Python码农们早就用上这个工具包,不过鉴于虾神的读者,还是以GIS圈子的同学比较多,所以觉得还有必要给大家推介一下这个神奇的debug工具。使用,就更简单了,导入,然后写一个装饰器(不知道啥是装饰器的同学,去参考其他文章,如果懒得去了解,就硬记下来这样用就行):方法很简单,求素数(啥叫素数,自己去放小学数学)。(PS:素数是数论里面一个很有意思的问题,它在逐步计算到它自身之前,都无法判断,只能逐步迭代,没有快速判定,用数学家的说法:素数随机的出现在数轴上,无法预先判定,素数号称数论的皇冠,各种数学大佬们们都对它进行了研究,恐怖如斯……)从100计算到200,第一轮循环的时候,i = 100,当 j = 2的时候,flag就已经等于false,跳出循环。然后第二轮循环,i = 101,j =2开始,一直到sqrt(101)+1,也就是2-11,迭代之后,发现都没有因子,所以得到101是素数,加入到p这个List中:从以上debug输出结果可以看出,PySnooper输出信息主要包括以下几个部分:也就是说,把我们日常DEBUG所需要的主要信息都输出出来了。而且还有运行的时间,这样还可以用来调试代码效率。当然,你也可以选择输出成日志,这样还可以后续分析,比如:当然,为了区别多个function,也可以加前缀:加入知识星球【我们谈论数据科学】
500+小伙伴一起学习!
· 推荐阅读 ·
geopandas轻松绘制交互式在线地图
地图可视化:geopandas绘制拓扑着色地图
新一代Python包管理工具来了