编写python的91个建议(1)

我看专业类的书籍有一个癖好,就是喜欢翻它扉页上面的出版日期,如果出版日期距离现在有了5年以上的时间了,那我对这本书的兴趣也少了不少,虽然很多时候是冲着书名去的。但是技术发展这么快,每年都有大量新的技术,新的思想出现,所以除了那种公认的经典技术书籍,一般过了5年的时间,书中所描述的技术也很可能已经过时了。

之前翻过跟代码质量有关的经典书籍如:《重构,改善代码原有的设计》,《代码大全》,《代码整洁之道》等等,这类书籍真是看一遍就受益匪浅。但仅仅看一遍呢,印象也并不怎么深刻,当时没做笔记,看过的内容都已经忘记的差不多,在实践过程中,虽然能偶尔想起书中所描述的只言片语,但最终还是不能够信手拈来的按照大师们的理论来指导自己编码。所以看书,特别是专业书,做笔记,回顾是必要的课程。

今天开始看的这本书叫《编写高质量的代码,改善python程序的91个建议》。最近对怎么写出质量高,颜值也高的代码非常有兴趣,但是代码的质量跟写代码的多少有直接的关系,但同时也不能不借鉴前人总结出的经验,站在巨人的肩膀上望一望。

虽然没学过python,但语言只是工具,绝大部分编程语言都大同小异。就像倚天屠龙记里张无忌学会了九阳神功之后,天底下的其他武功绝学,在他看来都是小儿科一样。写代码也是一样的道理咯,最重要的还是思想。

作者提出了91条编写python的建议,每一条都非常精简的概括出要义,非常容易理解。前三条是要我们在写python的时候,能够写出具有python独特风格的pythonic的代码。那什么是pythonnic的代码? 一句话:只可意会不可言传。更具体的,当你在控制台输入python,进入python的命令行交互界面,并输入指令:import this 的时候,你会看到如下的一首诗:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

用精简的中文翻译就是:

1
2
3
4
python之禅
美胜丑,显胜隐,简胜杂,杂胜乱,平胜陡,疏胜密。
找到简单问题的一个方法,最好是唯一的方法。
难以解释的实现,源自于不好的主意;如果有非常好的主意,那它肯定易于解释。

用一句话总结pytonic的代码,那就是充分利用python的独特语法特性和库特性,遵从业界公认的好的代码风格,写出简洁易懂的代码。

接下来第4,5个建议是关于代码注释和让代码看上去整洁的建议。需要对注释有正确的理解。注释太多和太少都不是好主意。注释是对代码的补充,不能让注释成为对代码的翻译,也不能让注释对代码产生歧义。在代码间适当的添加空行,会有利于代码的阅读。一组代码表达完一个完整的思路后,最好用空行进行间隔。现代代码编辑工具都是集成环境(IDE),它内部集成了比较良好的代码格式化工具。充分利用好IDE的功能,是一个不错的选择。

第6个建议是关于编写函数的。作者罗列了4个原则:

1
2
3
4
5
6
7
原则一:函数设计要尽量短小,嵌套层次不宜过深。

原则二:函数的申明应该做到合理简单,易于使用。

原则三:函数的设计应该经过深思熟虑,考虑到向下兼容。

原则四:一个函数只做一件事情。

这四条编写函数的原则,是独立于语言的,它对任何语言编写的程序来说,都是适用的准则。是一种思想。这里要解释一下原则四,何为只做一件事情?我们必须要有一个参照基准,那就是在同一个抽象层级上面,所有语句尽量在同一个粒度上。

第7个建议是将常量集中到同一个文件之中,常量的命名最好全大写表示。这个比较好理解,放在同一个文件中,修改起来更容易寻找。

第8个建议是正确的使用断言(assert))。断言会对性能有影响,因此不要滥用断言,断言应该使用在正常逻辑不可到达的地方或者正常情况下总是为真的场景。像数组越界,类型不匹配,处理用户输入等异常时不适合用断言。

第9个建议是特定与python语法的,就是数据交换时,不推荐使用中间变量值。而是这样使用:

1
x,y = y,x;

第10条建议很有意思,是说充分利用延迟计算的特性。什么是延迟计算,其实很多语言都有这个特性,就是条件表达式中,if x and y ,当x为false的时候,y表达式的值将不再计算;if x or y ,当x的值为true时,将直接返回,不再计算y的值。巧妙的运用这一特性,可以在某些场合提高程序的性能。

------ 本文结束 ------
TisaKong wechat
启发思维个人微信公众号
0%