45

Pythonic:Python 修炼之道

 4 years ago
source link: https://www.tuicool.com/articles/Y3uYRni
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

MFrEveb.gif

作者简介

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

ARBBJvN.png!web

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

干货概览

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

RZJJjau.jpg!web

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

小码的快速编码大法

小码是一名互联网程序员,因为代码码的快,产出量大,因此被同事亲切地称呼为小码。小码本是一名C++程序员,但是他毕竟以快闻名,由于C++的难度,小码已到瓶颈,代码还想码得更快必须另寻他路。近日,小码听闻江湖传言,Python是一门结构简单,开发效率极高的语言。于是,小码便想会一会Python~

ArIvi2v.png!web

小码通过 《Python从入门到放弃》 一书品了品Python的语法,确实简单,可以出关了。

这日,小码收到产品经理的一个高优需求,该需求中包含一个功能:需要读文件的每一行并在每一行加入特定字符。这不刚学了Python吗,小码正好开始试试刚出炉的快速编码招式。

第一招:什锦式编程

小码毕竟已有C++编码经验,对于更加简洁的Python,小码更是信手捏来:

fIFjYrE.png!web

一份充满了C++味道的Python代码应运而生。

小码窃窃自喜,开始研究需求中的其他功能:需要读文件的每一行并倒序返回。于是小码开始第二招。

第二招:复制粘贴大法

这功能看起来与第一个有很多复用之处,Copy一波,Ctrl+C, Ctrl+V然后稍作修改即可。

QzmEZf7.png!web

一份集复制粘贴大法与什锦式编程的代码出现了,就连日志打印也可以Copy一下。

功能已经实现,以快著称的小码必须快速完成需求,继续研究其他需求,发现需要根据不同的请求做多种处理,这个难不倒小码,if else大法行天下。

第三招:if else大法

bmERBvZ.jpg!web

有了这if else大法,什么功能都实现了,自测无误,美滋滋,来提交一下Code Review之后马上提测。

正当小码正沉浸于砖搬完后的欢喜之时,Code Review被打回了,原因为代码非常不Pythonic。小码赶紧询问大佬,什么是Pythonic,大佬给了一本秘籍 《Pythonic——Python修炼之道》

Python修炼之道

1

Python之禅

勤学的小码打开《Pythonic——Python修炼之道》,映入眼帘第一句话便是 “欲练此功,必先import this” 。这,无需自宫就行,小码打开Python解释器,import this,彩蛋出现了:

Ybaiua2.png!web

翻译一下,就是:

Python之禅

优美胜于丑陋

显式胜于隐式

简单胜于复杂

复杂胜于难懂

扁平胜于嵌套

稀疏胜于紧密

可读性应该被重视

......

原来这就是Pythonic,开始闭关学习。

2

Pythonic之列表推导式

使用列表推导式可以使 代码更加简洁 ,是Python特有的语法,能用一行代码实现其他语言多行代码才能实现的功能。

比如小码使用for循环遍历列表,用Pythonic的方法可以这么实现:

与列表推导式对应的还有字典:

3

Pythonic之上下文管理器

上下文管理器也是Python特有的语法,适用于对资源进行访问的场合,不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,使用with来简化代码。

比如小码在实现文件读写时可以这么写:

iqqAJrE.png!web

有了上下文管理器,可以更简洁地处理资源访问的场合,无论是文件,锁或者是自定义资源,妈妈再也不用担心出现程序异常而未释放资源的情况了。

4

Pythonic之分片

Python中有个概念叫做分片,可以通过合理地使用分片来使代码更加Pythonic。

通过分片能够更加简洁地反转字符串,列表,元组等数据结构,一行代码即可:

5

Pythonic之装饰器

Python装饰器就是用于拓展原来函数功能的一种函数,目的是在不改变原函数名(或类名)的情况下,给函数增加新的功能,经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。

比如小码的代码中的日志打印,便可以直接使用装饰器,所有需要打印相同类型日志的函数只需要使用装饰器进行装饰即可,这样代码会更加简洁,可读性更好。

Y3YRnqy.jpg!web

6

Pythonic之动态语言特性

Python是一种动态语言,意味着我们可以在程序中处理已有的程序。因此,很多时候可以摈弃if else的写法,充分利用Python动态语言特性,使用函数对象即可。

当需要处理多种请求时,我们可以请将处理函数命名为请求名。通过 hasattr() 函数判断处理类是否拥有相应的属性,如果没有,则不支持该请求。如果有,则通过 getattr() 获得该请求的处理函数,然后调用该函数进行处理。

zMnQF3n.png!web

学习完以上这些Pythonic的方法,小码受益匪浅,赶紧修改自己的代码。寥寥数语就实现了所有功能,开发效率比所谓“快速编码大法”更高,Review通过,顺利提测(篇幅有限,示例代码省去了注释,其他功能在FileOperation类中可扩展)。

yeemUjR.jpg!web

Pythonic实践

Python还有很多种能够使代码更加Pythonic的方法,小码想要通过了解更多Pythonic的实践来学习Python。于是,打开《Pythonic——Python修炼之道》最后一页,赫然写着:如果想要了解更多Pythonic的工程实践,可以访问 https://github.com/baidu/ARK

ARK是百度基础架构部开发的基于事件驱动模型的智能运维开发框架,以简化运维工程师的平台工具研发过程为使命,可以扩展实现各种自维护机器人或运维平台。

小码行动起来,通过ARK的阅读与学习,小码不仅提升了自身的Python水平,还了解到了智能运维的工程化方案,一举两得。

VNjieij.jpg!web

通过ARK的阅读与使用,小码觉得开发ARK的团队好像还不错,何不加入呢?于是小码关注了公众号 "AIOps智能运维" ,发现此公众号不仅有海量的技术文章分享,还有实时的招聘信息,虽然目前只有校招信息,小码暂无法加入,但是可以让学弟学妹们加入啊!

RECOMMEND

推荐阅读

vQRNb26.jpg!web

3eY7ZjI.jpg!web

eqIveiq.jpg!web

3MNrErZ.gif

↓↓↓ 点击"阅读原文" 【了解更多精彩内容】


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK