《import this》背后的故事
作者:刘志军,6年+Python使用经验, 高级开发工程师,目前在互联网医疗行业从事Web系统构架工作
个人公众号:Python之禅(微信ID:vttalk)
题图:Photo by Caroline Grondin on Unsplash
大家猜猜下面这段文本是什么意思,看起来好像挺熟悉的。
"""
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!
"""
可能你已经猜出来了,没错,每个 Pythoneer 都知道的彩蛋,在交互式命令行输入 import this,会有一段 Python 之禅格言,作者是内核开发者 Tim Peters, Guido 叔的 Python 语言设计指导原则浓缩为了 19 条开发哲学。
这段加密文本并不是我故弄玄虚,而是this 模块中的源代码,使用下面这个算法就可以解密出来
https://github.com/python/cpython/blob/master/Lib/this.py
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]))
这究竟是个什么算法?
>>> chr(97)
'a'
>>> chr(65)
'A'
65 是大写 A 的十进制表示法,97 是小写 a 的十进制表示法。字典 d
最终会构成这样一个映射表
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz | | NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm
26个字母从A映射到N、B映射到O、依此类推到M映射到Z,然后反转,N映射到A、O映射到B、Z映射到M,26个小写字母也是同样的机制,这就是 ROT13 密码算法。以后要是有面试官要你徒手写个 ROT 算法,你要能很快想起来。
ROT13(回转13位)是一种替换式密码,属于对称加密,加密和解密同一套算法,而且密钥都一样,它是凯撒加密的一种变体。一段文字按照字母顺序只需把当前字母用13位之后的对应字母进行替代,超过第13位的字母(从N开始)则重新绕回到字母表的开头即可。而对于非字母字符还是保持原样不变。于是,文章开头的文本经过 ROT13 转换,就是我们平常最熟悉的 Python 之禅:
"""
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!
"""
关于import this 这个彩蛋的来由以及 《The Zen of Python》 的历史故事,是发生在一次 Pycon 大会上,主办方想给大会定一个 Slogan 印在T恤上,然后大家奇思异想,最后几百候选名单出选出了 import this,紧接着这个彩蛋放在了 Python 2.2.1 发布。感兴趣的可以参考
https://www.wefearchange.org/2010/06/import-this-and-zen-of-python.html
这衣服有没有感觉很geek?
Python爱好者社区历史文章列表(每周append更新一次)
关注后在公众号内回复“课程”即可获取:
小编的Python入门视频课程!!!
崔老师爬虫实战案例免费学习视频。
丘老师数据科学入门指导免费学习视频。
陈老师数据分析报告制作免费学习视频。
玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。
丘老师Python网络爬虫实战免费学习视频。