作为一个码农,大家一定会有阅读祖传代码的经历。由于“快功出粗活”,很多人写代码就是一把“梭”,最终码农们互相吐槽,冤冤相报,导致一个业务系统代码可读性越来越差,越来越难以维护。
为了让码农们的头发少掉一些,我们需要从自身做起,写出更优雅的代码,利人利己。今天,我们从Python的角度聊聊如何写出可读性更好的代码,来看看程序员小码的经历。
本文由AIOps智能运维原创,作者金海飞,百度高级研发工程师。
小码的快速编码大法
小码是一名互联网程序员,因为代码码的快,产出量大,因此被同事亲切地称呼为小码。小码本是一名C++程序员,但是他毕竟以快闻名,由于C++的难度,小码已到瓶颈,代码还想码得更快必须另寻他路。近日,小码听闻江湖传言,Python是一门结构简单,开发效率极高的语言。于是,小码便想会一会Python~
小码通过《Python从入门到放弃》一书品了品Python的语法,确实简单,可以出关了。
这日,小码收到产品经理的一个高优需求,该需求中包含一个功能:需要读文件的每一行并在每一行加入特定字符。这不刚学了Python吗,小码正好开始试试刚出炉的快速编码招式。
第一招:什锦式编程小码毕竟已有C++编码经验,对于更加简洁的Python,小码更是信手捏来:
一份充满了C++味道的Python代码应运而生。
小码窃窃自喜,开始研究需求中的其他功能:需要读文件的每一行并倒序返回。于是小码开始第二招。
第二招:复制粘贴大法这功能看起来与第一个有很多复用之处,Copy一波,Ctrl+C,Ctrl+V然后稍作修改即可。
一份集复制粘贴大法与什锦式编程的代码出现了,就连日志打印也可以Copy一下。
功能已经实现,以快著称的小码必须快速完成需求,继续研究其他需求,发现需要根据不同的请求做多种处理,这个难不倒小码,ifelse大法行天下。
第三招:ifelse大法有了这ifelse大法,什么功能都实现了,自测无误,美滋滋,来提交一下CodeReview之后马上提测。
正当小码正沉浸于砖搬完后的欢喜之时,CodeReview被打回了,原因为代码非常不Pythonic。小码赶紧询问大佬,什么是Pythonic,大佬给了一本秘籍《Pythonic——Python修炼之道》。
Python修炼之道
1Python之禅勤学的小码打开《Pythonic——Python修炼之道》,映入眼帘第一句话便是“欲练此功,必先importthis”。这,无需自宫就行,小码打开Python解释器,importthis,彩蛋出现了:
翻译一下,就是:
Python之禅
优美胜于丑陋
显式胜于隐式
简单胜于复杂
复杂胜于难懂
扁平胜于嵌套
稀疏胜于紧密
可读性应该被重视
......
原来这就是Pythonic,开始闭关学习。
2Pythonic之列表推导式使用列表推导式可以使代码更加简洁,是Python特有的语法,能用一行代码实现其他语言多行代码才能实现的功能。
比如小码使用for循环遍历列表,用Pythonic的方法可以这么实现:
与列表推导式对应的还有字典:
3Pythonic之上下文管理器上下文管理器也是Python特有的语法,适用于对资源进行访问的场合,不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,使用with来简化代码。比如小码在实现文件读写时可以这么写:有了上下文管理器,可以更简洁地处理资源访问的场合,无论是文件,锁或者是自定义资源,妈妈再也不用担心出现程序异常而未释放资源的情况了。4Pythonic之分片Python中有个概念叫做分片,可以通过合理地使用分片来使代码更加Pythonic。
通过分片能够更加简洁地反转字符串,列表,元组等数据结构,一行代码即可:
5Pythonic之装饰器Python装饰器就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能,经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。
比如小码的代码中的日志打印,便可以直接使用装饰器,所有需要打印相同类型日志的函数只需要使用装饰器进行装饰即可,这样代码会更加简洁,可读性更好。
6Pythonic之动态语言特性Python是一种动态语言,意味着我们可以在程序中处理已有的程序。因此,很多时候可以摈弃ifelse的写法,充分利用Python动态语言特性,使用函数对象即可。
当需要处理多种请求时,我们可以请将处理函数命名为请求名。通过hasattr()函数判断处理类是否拥有相应的属性,如果没有,则不支持该请求。如果有,则通过getattr()获得该请求的处理函数,然后调用该函数进行处理。
学习完以上这些Pythonic的方法,小码受益匪浅,赶紧修改自己的代码。寥寥数语就实现了所有功能,开发效率比所谓“快速编码大法”更高,Review通过,顺利提测(篇幅有限,示例代码省去了注释,其他功能在FileOperation类中可扩展)。
Pythonic实践
Python还有很多种能够使代码更加Pythonic的方法,小码想要通过了解更多Pythonic的实践来学习Python。于是,打开《Pythonic——Python修炼之道》最后一页,赫然写着:如果想要了解更多Pythonic的工程实践,可以访问