"this"模块的源代码是什么?

byt*_*ian 173 python

如果您打开Python解释器,并输入"import this",如您所知,它会打印:

Tim Peters的Python之禅

美丽胜过丑陋.
显式优于隐式.
简单比复杂更好.
复杂比复杂更好.
Flat优于嵌套.
稀疏优于密集.
可读性很重要.
特殊情况不足以打破规则.
虽然实用性胜过纯洁.
错误不应该默默地传递.
除非明确沉默.
面对模棱两可,拒绝猜测的诱惑.
应该有一个 - 最好只有一个 - 明显的方法来做到这一点.
虽然这种方式起初可能并不明显,除非你是荷兰人.
现在比永远好.
虽然从未往往比好正确的现在.
如果实施很难解释,这是一个坏主意.
如果实现很容易解释,那可能是个好主意.
命名空间是一个很棒的主意 - 让我们做更多的事情吧!

在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])
Run Code Online (Sandbox Code Playgroud)

Eli*_*sky 166

这称为rot13编码:

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

构建转换表,大写(这是65用于)和小写(这是97用于)chars.

print "".join([d.get(c, c) for c in s])
Run Code Online (Sandbox Code Playgroud)

打印翻译的字符串.

  • @OllieFord:作为一个笑话.模块所做的一切,从混淆源代码到实现rot13,即使它是内置到stdlib中,直接违反了Python的Zen.蒂姆·彼得斯也向禅本身偷了一些微妙的笑话(注意TOOWTDI线上的破折号有两种不同的方式吗?). (47认同)
  • 这实际上可以在2.x和3.x中更简单地实现为`import codecs; print(codecs.decode(s,"rot-13"))`.手动编写算法就像复活节彩蛋的进一步混淆一样. (25认同)
  • 或者只是''Gur Mra bs Clguba,ol Gvz Crgref'.decode('rot13')`. (11认同)
  • @abarnert我认为模块的名称`this`也是笑话的一部分,因为其他语言(例如Java)使用`this`类似于Python使用`self`的方式.输入`import this`看起来和输入`import java.self;`一样毫无意义. (6认同)
  • 也许我们应该补充一点,ROT13是旧的usenet天8 ^)中使用的主要"加密"方法 (2认同)
  • 我注意到很多人都使用了_encoding_这个词,包括wiki.不是_encryption_?对于其他一些进程来说,它并不是完全编码的,它是混淆的. (2认同)
  • @Zach 因为它是 python zen 的最后一个字符,考虑到我们用 `for c in s` 迭代它 (2认同)
  • @keyser *加密*意味着只有特定的实体才能*解密*秘密消息;在此过程中,它需要一个“秘钥”。* encoding *没有秘密,它只是以* alternative *表示形式表示数据。如果您知道它是ROT13编码的,则可以轻松对其进行解码。如果您知道它是Base 64编码,ASCII编码或百分比编码的,则可以轻松对其进行解码。ROT13是一种*编码*。 (2认同)
  • @deceze 我听到你在说什么,但我仍然认为加密算法是轮换,密钥是轮换的长度。这是糟糕的加密,当然。这是加密维基的开头顺便说一句:“加密是对消息进行编码的过程”:) (2认同)

ype*_*eᵀᴹ 23

如果你想手工或者在你的头脑中进行ROT13替换,你可以检查一下,因为13*2 = 26(英文字母的字母数),它本质上是一个交换:

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

A <-> N
B <-> O
C <-> P
...
M <-> Z 
Run Code Online (Sandbox Code Playgroud)

Vs lbh cenpgvfr ybat rabhtu,lbh'yy riraghnyyl znfgre gur Mra bs EBG-13 nytbevguz naq ernq guvf Xyvatba ybbxvat grkgf jvgubhg pbzchgre uryc.


Mic*_*ber 9

这是一个替代密码,rot13.


小智 7

它是替换密码(如前面的答案所述).从历史上看,它是凯撒密码.

https://www.google.de/search?q=caesar+cipher&cad=h


小智 6

它使用ROT13编码.使用它是因为它是一个笑话.

您还可以使用Python函数来解码字符串.

仅限Python 2:

import this
print(this.s.decode('rot13'))
Run Code Online (Sandbox Code Playgroud)

Python 2&3:

import codecs
print(codecs.decode(this.s, 'rot-13'))
Run Code Online (Sandbox Code Playgroud)