“this”模块的源代码在做什么?

235 投票
5 回答
82018 浏览
提问于 2025-04-16 16:48

如果你打开一个Python解释器,输入“import this”,你会看到以下内容:

Python的哲学,作者:Tim Peters

美比丑好。
明确比含糊好。
简单比复杂好。
复杂比麻烦好。
平坦比嵌套好。
稀疏比密集好。
可读性很重要。
特殊情况不够特殊,不值得打破规则。
实用性胜过纯粹性。
错误不应该被忽视。
除非明确地被忽视。
面对模糊的情况,拒绝猜测的诱惑。
应该有一种——最好只有一种——明显的方法来做这件事。
不过这种方法一开始可能不明显,除非你是荷兰人。
现在做比永远不做要好。
不过永远不做通常比“现在就做”要好。
如果实现起来很难解释,那就是个坏主意。
如果实现起来容易解释,那可能是个好主意。
命名空间是个非常棒的主意——我们应该多用这些!

在Python的源代码(Lib/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])

5 个回答

18

它使用了ROT13编码。这是因为这是一个玩笑。

你也可以用Python的函数来解码字符串。

仅适用于Python 2:

import this
print(this.s.decode('rot13'))

适用于Python 2和3:

import codecs
print(codecs.decode(this.s, 'rot-13'))
27

如果你想手动或者用脑子来做ROT13替换,可以注意到因为13乘以2等于26(这是英语字母的总数),所以这实际上就是一种互换。

a <-> n
b <-> o
c <-> p
...
m <-> z

A <-> N
B <-> O
C <-> P
...
M <-> Z 

如果你在想如何加密一段文本,你可以直接使用ROT13方法来处理,比如把字母替换成它后面第13个的字母。这样做的话,你就能得到一个新的字符串,读起来也会很有趣。

214

这叫做 rot13 编码:

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

它会创建一个翻译表,用来处理大写字母(65就是用来处理大写字母的)和小写字母(97就是用来处理小写字母的)。

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

然后打印出翻译后的字符串。

撰写回答