所在的位置: 程序员 >> 概念 >> PythonicPython修炼之道

PythonicPython修炼之道

白癜风能治好吗 http://pf.39.net/bdfyy/bdflx/190522/7157873.html

作者简介

金海飞百度高级研发工程师

负责百度智能运维产品(Noah)基础组件的设计研发工作,在程序部署、数据传输方面有广泛的实践经验。

干货概览

作为一个码农,大家一定会有阅读 代码的经历。由于“快功出粗活”,很多人写代码就是一把“梭”,最终码农们互相吐槽,冤冤相报,导致一个业务系统代码可读性越来越差,越来越难以维护。

为了让码农们的头发少掉一些,我们需要从自身做起,写出更优雅的代码,利人利己。今天,我们从Python的角度聊聊如何写出可读性更好的代码,来看看程序员小码的经历。

小码的快速编码大法

小码是一名互联网程序员,因为代码码的快,产出量大,因此被同事亲切地称呼为小码。小码本是一名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的工程实践,可以访问


转载请注明:http://www.xxcyfilter.com/gailian/gailian/10748.html