211 votes

Que fait le code source du module "this" ?

Si vous ouvrez un interpréteur Python et tapez "import this", comme vous le savez, il imprime :

Le Zen du Python, par Tim Peters

Le beau est mieux que le laid.
L'explicite est préférable à l'implicite.
La simplicité est préférable à la complexité.
Le complexe est mieux que le compliqué.
Le plat est meilleur que l'imbriqué.
Le clairsemé est préférable au dense.
La lisibilité compte.
Les cas particuliers ne sont pas assez particuliers pour enfreindre les règles.
Bien que l'aspect pratique batte la pureté.
Les erreurs ne doivent jamais passer en silence.
Sauf si elle est explicitement réduite au silence.
Face à l'ambiguïté, refusez la tentation de deviner.
Il devrait y avoir une - et de préférence une seule - manière évidente de le faire.
Bien que cette voie ne soit pas forcément évidente au premier abord, à moins d'être néerlandais.
Mieux vaut maintenant que jamais.
Bien que jamais soit souvent mieux que droite maintenant.
Si la mise en œuvre est difficile à expliquer, c'est une mauvaise idée.
Si la mise en œuvre est facile à expliquer, cela peut être une bonne idée.
Les espaces de noms sont une idée géniale - il faut en faire plus !

Dans la source python (Lib/this.py), ce texte est généré par un curieux morceau de code :

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

200voto

Eli Bendersky Points 82298

C'est ce qu'on appelle rot13 l'encodage :

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

Construit la table de traduction, à la fois pour les caractères majuscules (ce à quoi sert le 65) et minuscules (ce à quoi sert le 97).

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

Imprime la chaîne traduite.

27 votes

Et cela peut en fait être mis en œuvre plus simplement dans les versions 2.x et 3.x en tant que import codecs; print(codecs.decode(s, "rot-13")) . Écrire l'algorithme à la main comme ça n'était qu'une dissimulation supplémentaire de l'oeuf de Pâques.

13 votes

Ou juste 'Gur Mra bs Clguba, ol Gvz Crgref'.decode('rot13') .

4 votes

Peut-être devrions-nous ajouter que ROT13 était la principale méthode de "cryptage" utilisée à l'époque de Usenet 8^).

25voto

ypercube Points 62714

Si vous voulez faire le ROT13 substitution à la main - ou dans votre tête - vous pouvez vérifier que parce que 13*2 = 26 (le nombre de lettres de l'alphabet anglais), il s'agit essentiellement d'un échange :

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

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

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

14voto

trapwalker Points 139

Il utilise ROT13 encodage. Il est utilisé parce que c'est une blague.

Vous pouvez également utiliser les fonctions Python pour décoder les chaînes de caractères.

Python 2 uniquement :

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

Python 2 et 3 :

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

12voto

Michael J. Barber Points 12837

C'est un code de substitution, rot13 .

9voto

C'est un chiffre de substitution (comme mentionné dans les réponses précédentes). Historiquement parlant, c'est le Chiffre César .

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X