分享8点超级有用的Python编程建议

640?wx_fmt=jpeg


作者 | Samshare  

来源 | SAMshare


我们在用Python进行机器学习建模项目的时候,每个人都会有自己的一套项目文件管理的习惯,我自己也有一套方法,是自己曾经踩过的坑总结出来的,现在在这里分享一下给大家,希望多少有些地方可以给大家借鉴。


先睹为快


  • 项目文件事先做好归档

  • 永远不要手动修改源数据并且做好备份

  • 做好路径的正确配置

  • 代码必要的地方做好备注与说明

  • 加速你的Python循环代码

  • 可视化你的循环代码进度

  • 使用高效的异常捕获工具

  • 要多考虑代码健壮性


1. 项目文件事先做好归档 ?


每次开始一个新工作的时候,以前的我总是贪图方便,Code、Data、文档都集中放在一个文件夹内,看起来很乱,一度让回溯过程十分痛苦,或者是换了部电脑,文件全都运行不行了,需要自行修改路径,十分痛苦。


经过自己一番探索,大家可以大致将项目分成几个子文件夹,code放在主文件夹里:


640?wx_fmt=png


2. 永远不要手动修改源数据并且做好备份 ✍️


我们需要对源数据进行好备份,方便我们下一次进行回溯,可以进行下一步的操作或者是对中间步骤的修改,而且,对代码等其他文件也是需要做好备份的,以免出现意外丢失。


这里来自良许Linux 的一篇文章,推荐了4个工具


  • Git版本控制系统

  • Rsync文件备份

  • Dropbox云存储

  • Time Machine时光机器


更多的工具介绍和使用我这边就不展开,大家可以去自行了解呗。


3. 做好路径的正确配置 


很多同学在写路径的时候都很喜欢直接用绝对路径,虽然一般情况下不会有什么问题,但如果代码共享给其他人学习或者运行的时候,问题就来了,很多情况下都不能直接跑通,这里建议:


  • 使用相对路径:脚本位于主目录下,其他资源(如数据、第三方包等)在其同级或低级目录下,如 ./data/processed/test1.csv

  • 全局路径配置变量:

 
 
 
 


4. 代码必要的地方做好备注与说明 ?


这个我相信大多数人都感同身受了,不信?拿回一个月前自己写的代码看看吧,看一下能看懂多少(如果没有做好备注说明的话)


5. 加速你的Python循环代码 ⚡️


这里推荐 云哥(Python与算法之美)的一篇文章:24式加速你的python

收藏起来,多看多几次,养成好习惯呗,这样子你写代码才会越来越快~


6. 可视化你的循环代码进度?


这里介绍一个Python库,tqdm,先安装一下:pip install tqdm


这个是一个可以显示循环进度的库,有了它就可以更加运筹帷幄了。


大家可以看下面的例子:


640?wx_fmt=png


7. 使用高效的异常捕获工具 ?


异常bug定位,以前的我经常也是一条print()函数走到底,虽然说也没什么问题,但效率上还是会比较慢,后来发现了一个叫PySnooper的装饰器,仿佛发现了新大陆。


我们一般debug,都是在我们可能觉得会有问题的地方,去打印输出,看下实际输出了什么,然后思考问题所在,这需要我们去改code,非常细致地改,相比较直接加个装饰器,是十分麻烦的。


大家可以看看Example:


 
 

我们把函数每一步的输出都保存为file.log,我们可以直接去看到底哪里出了问题。


640?wx_fmt=png

? 项目地址:https://github.com/cool-RR/pysnooper


8. 要多考虑代码健壮性 ?


何为代码的健壮性,顾名思义,就是可以抵挡得住各种异常场景的测试,异常处理工作由“捕获”和“抛出”两部分组成。“捕获”指的是使用 try ... except 包裹特定语句,妥当的完成错误流程处理。而恰当的使用 raise 主动“抛出”异常,更是优雅代码里必不可少的组成部分,下面总结几点供大家参考:


1)知道要传入的参数是什么,类型,个数 (异常处理,逻辑判断)


 
 

2)只做最精准的异常捕获


我们有的时候想着让脚本work才是王道,所以不管三七二十一就搞一个大大的try...except把整块代码包裹起来,但这样很容易把原本该被抛出的

AttibuteError 吞噬了。从而给我们的 debug 过程增加了不必要的麻烦。

所以,我们永远只捕获那些可能会抛出异常的语句块,而且尽量只捕获精确的异常类型,而不是模糊的 Exception。


 
 

3)异常处理不应该喧宾夺主


像上一条说到的异常捕获要精准,但如果每一个都很精准的话,其实我们的代码里就会有很多try...except语句块,以至于扰乱核心代码,代码整体阅读性。


这里,我们可以利用上下文管理器来改善我们的异常处理流程,简化重复的异常处理逻辑。


 
 

在上面的代码里,我们定义了一个名为 raise_api_error 的上下文管理器,它在进入上下文时什么也不做。但是在退出上下文时,会判断当前上下文中是否抛出了类型为 self.captures 的异常,如果有,就用 APIErrorCode 异常类替代它。


使用上下文管理器后,简洁的代码如下:



Reference


  • 我常用的4个备份工具——良许Linux  

  • 好玩的Python库tqdm

    https://blog.csdn.net/zejianli/article/details/77915751

  • 24式加速你的python

  • Errors and Exceptions

    https://docs.python.org/3.6/tutorial/errors.html

  • 掌握Python异常处理,看这篇文章就对了 | 鹅厂实战

    https://zhuanlan.zhihu.com/p/67917674

  • 搞不清楚Python的异常怎么用?

    https://baijiahao.baidu.com/s?id=1607836559889635254&wfr=spider&for=pc



(*本文仅代表作者观点,转载请联系原作者)


精彩推荐


大会开幕倒计时 天!2019 以太坊技术及应用大会特邀以太坊创始人V神与众多海内外知名技术专家齐聚北京,聚焦区块链技术,把握时代机遇,深耕行业应用,共话以太坊 2.0 新生态。即刻扫码,享优惠票价!


640?wx_fmt=jpeg

推荐阅读:


640?wx_fmt=png 你点的每个“在看”,我都认真当成了喜欢
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值