Python之禅(zen of python)

2019年6月12日 / 179次阅读 / Last Modified 2019年8月7日
故事

所谓Python之禅,zen of python,其实是比PEP8级别更高的编程哲学。这个哲学的描述性文字,被嵌入了Python的解释器中。我们可以在Python解释器中,使用 import this 来随时查看Python的禅的具体内容。特别是在做设计,没有灵感的时候,拿出来看看,寻找方法。

Python之禅的查看方式和具体内容

>>> import this
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!

这段文字,存放在了PEP20文件中,官方地址是:https://www.python.org/dev/peps/pep-0020/。如果你对the zen of python有不满意的地方,还可以去Github提PR。现在Python的所有PEP文件,都在Github上,地址为:https://github.com/python/peps

还可以用这种方式将Python之禅打印出来: $python -c 'import this'

Python import this T恤
Python import this T恤

Python之禅中文版

下面我来尝试翻译这段被誉为禅的文字,与各位工程师共勉:

美丽的比丑陋的更好。
显式的比隐式的更好。
简单的比复杂的更好。
复杂的比难以理解的更好。(不能简化,至少还要保证可理解)
平整的比嵌套的更好。
稀疏的比密集的更好。
可读性很有价值。
特殊情况并没有特殊到需要破坏规则的程度。
然而,实用性打败了纯粹的代码美学。(现实应用更重要)
错误永远不应该无声无息,
除非被显式地抑制。
面对模糊不清时,拒绝去猜测,
应该有且只有一个更好的明确清晰的方法,去解决问题。
虽然这个方法一开始可能并不明显,除非你是荷兰人(指Python之父Guido)。
现在开始做比永远不做更好。
虽然永远不做常常优于没有思考的直接行动。
如果实现方式很难解释,这就不是好的实现。
如果实现方式很容易解释,这可能是好的实现。
命令空间是一个超好的机制,我们需要多多地应用。

Python之禅的作者:Tim Peters

Tim Peters,美国的一位软件工程师,他在Python发展的早期,就参与了这个语言的开发和设计。他是Python语言以及CPython的主要contributor之一。他创造了Timsort hybrid sorting算法,这个算法从Python2.3开始就在使用。Python标准模块中的doctest和timeit,也是他的大作。

下面来一张他的照片,这张照片是在2004年的Pycon会议期间拍的:

Tim Peters在Pycon
Tim Peters在Pycon

Python之禅的由来

正如Python的起源和发展一样,这段Python之禅的问题的出现,也有一个短有趣的故事。

2001年秋,Foretec(一家会议组织公司)正在准备召开第十届International Python Conference(IPC 10,Pycon的前身),Foretec打算征集一条印在会议T恤衫上的标语,最终他们从Python社区收到了500多条投稿。

Foretec邀请了Python的核心开发Guido,Fred,Jeremy,Tim Peters,Barry 等来担任评审。评审委员们从投稿中过滤出了130多条后就一直没有进展,直到会议快要召开时他们也没有确定最终标语。

在会议就要开始的前几天,到了评审们不得不做出决定的时候了。于是由Tim Peters和Barry两人轮流评审,每人每次淘汰一半留下一半,直到最后只剩一条。

最终,“import this”被选了出来,大家对“import this”非常满意。但是当选择了这条以后,他们意识到他们必须要实现它。经过简单的讨论后,“import this”的被定为输出Tim Peters写的《The Zen of Python》——Python编程和设计的指导原则。

this模块

既然this是一个标准模块,我们就可以找到它的代码来看看。this.py的路劲在Lib文件夹里面。源代码如下:

s = """Gur Mra bs Clguba, ol Gvz Crgref

Ornhgvshy vf orggre guna htyl.
Rkcyvpvg vf orggre guna vzcyvpvg.
Fvzcyr vf orggre guna pbzcyrk.
Pbzcyrk vf orggre guna pbzcyvpngrq.
Syng vf orggre guna arfgrq.
Fcnefr vf orggre guna qrafr.
Ernqnovyvgl pbhagf.
Fcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.
Nygubhtu cenpgvpnyvgl orngf chevgl.
Reebef fubhyq arire cnff fvyragyl.
Hayrff rkcyvpvgyl fvyraprq.
Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.
Gurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg.
Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu.
Abj vf orggre guna arire.
Nygubhtu arire vf bsgra orggre guna *evtug* abj.
Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.
Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.
Anzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!"""

d = {}
for c in (65, 97):
    for i in range(26):
        d[chr(i+c)] = chr((i+13) % 26 + c)

print("".join([d.get(c, c) for c in s]))

看不太懂吧。。。

这是因为代码中的s字符串使用了rot13加密。 rot13就是凯撒密码的一种,每个字母变换为它后面的第13个字母。例如A变换为它后面的第13个字母N,所有字母变换关系如下图:

rot13密码变换表
rot13密码变换表

等到IPC 10结束后,作为庆祝这次会议圆满结束的活动之一就是他们悄悄的把代码提交到Python 2.2.1。过了一段时间,才逐渐有人发现“import this”这个彩蛋。

import this里面的19条规则,如果应用得当,能提高代码的可读性,可用性,以及可维护性,CPython的代码开发,就是遵循这样的哲学。不过,比较搞笑的是,this模块本身的代码,违反了这19条规则中的大部分。^___^

-- EOF --

本文链接:https://www.pynote.net/archives/1

留言区

电子邮件地址不会被公开。 必填项已用*标注



后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top