Total visitor

复活节要到了,美国人有找彩蛋的习俗。我们生活中很多游戏、电影都会隐藏一些东西作为彩蛋,《头号玩家》是一部对于彩蛋文化很好的电影。其实我们天天使用的python也有一个彩蛋。

当你在python的命令行里敲出 import this, 会出现什么?在正常情况下,这个命令是引入一个包,然后就可以利用包里的函数,但是这个特殊的包会打印出python之禅

$ python
Python 3.7.3 (default, Mar 27 2019, 16:54:48) 
[Clang 4.0.1 (tags/RELEASE_401/final)] :: Anaconda, Inc. on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 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!

虽然我从python2的时代就开始使用python,但之前从来不知道这个彩蛋,当我发现的时候还是惊异不已的。这19条表明了python的设计思路以及在实现遵守的守则。

其中我最喜欢的一条还是“Simple is better than complex.” 简单总是比复杂好。在python中,我们可以使用较少的语句实现较多的功能。当有什么有意思的想法时,我们也可以利用python快速实现。虽然python与c++相比的确是慢了不少,但是在目前的硬件条件下和个人的应用场景下,这是可以接受的。python之所以可以做到这些一方面是python在设计之初就注意到的简易使用以及模块化的思想,另一方面也是开放的社区吸引众多的人来为其开发各种各样的模块。任何复杂的东西其实都是通过简单的东西搭配起来的,在写代码的时候,把一个函数的内容变得简单明了,更加方便调试以及其他人的理解,也方便后续的维护。

其中还有两句比较令人费解:“Now is better than never. Although never is often better than right now.” 中文翻译就是现在总是比永远不做好,然而不假思索还不如不做。一开始看的时候感觉有点矛盾,第一句比较好理解,其实是讲拖延症。现在做一些事情是比一直在思考不动手好的,即使很多事情一开始想着要做,但是后来又有了很多的事情最后就不去完成了,所以做优于不做。后一句不是这么好理解,为什么有的时候不如不做呢?这里可以这么看的,在写代码的时候,你只需要去完成现在是需要的功能,而不需要去实现觉得可能未来要用上的功能。因为这可能只是一开始的一厢情愿,花了时间其实并没有花在点子上,有的事情做了还不如不做。三思而后行还是有一定的道理的,但是需要掌握一个平衡,做最重要的事情。

对于 import this 还有一点有趣的地方就是他的实现方法。一开始我以为就是打印一些字符串,但是当我打开python的源代码时发现并不是这样,文件可以在python的安装目录下查看this.py

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]))

这段文字是通过加密的手段的。加密方法本身还是很简单的,他是通过把每个字符移13个位子,例如 a -> n,这么做的原因可能是为了防止大家发现这个彩蛋吧。

python是我最喜欢也是使用最多的语言。python之禅帮助我对于这门语言有了更多的认识。