“This” modülünün kaynak kodu ne yapıyor?


193

Bir Python yorumlayıcısı açar ve "bunu içe aktar" yazarsanız, bildiğiniz gibi yazdırılır:

Python'un Zen'i, Tim Peters

Güzel, çirkin olmaktan iyidir.
Açık, örtük olmaktan iyidir.
Basit, karmaşık olmaktan iyidir.
Karmaşık karmaşık olmaktan iyidir.
Düz iç içe geçmişten daha iyidir.
Seyrek yoğun olmaktan iyidir.
Okunabilirlik önemlidir.
Özel durumlar kuralları ihlal edecek kadar özel değildir.
Pratiklik saflığı yenmesine rağmen.
Hatalar asla sessizce geçmemelidir.
Açıkça susturulmadıkça.
Belirsizlik karşısında, tahmin etme isteğini reddet.
Bunu yapmanın tek ve tercihen tek bir yolu olmalı.
Her ne kadar Hollandalı değilseniz bu yol ilk başta belli olmayabilir.
Şimdi hiç olmadığı kadar iyi.
Her ne kadar asla genellikle daha iyi olmasa daSağ şimdi.
Uygulamanın açıklanması zorsa, bu kötü bir fikirdir.
Uygulamanın açıklanması kolaysa, iyi bir fikir olabilir.
İsim alanları harika bir fikirdir - bunlardan daha fazlasını yapalım!

Python kaynağında (Lib / this.py) bu metin meraklı bir kod parçası tarafından üretilir:

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

Yanıtlar:


184

Buna rot13 kodlaması denir :

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

Hem büyük harf (65 bunun içindir) hem de küçük harf (97 bunun içindir) için çeviri tablosunu oluşturur.

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

Çevrilmiş dizeyi yazdırır.


27
Ve bu aslında hem 2.x hem de 3.x olarak daha basit bir şekilde uygulanabilir import codecs; print(codecs.decode(s, "rot-13")). Algoritmayı bu şekilde elle yazmak, paskalya yumurtasının daha da şaşırtmasıydı.
ncoghlan

12
Veya sadece 'Gur Mra bs Clguba, ol Gvz Crgref'.decode('rot13').
Alex Brasetvik

3
Belki de ROT13'ün eski usenet günlerinde kullanılan ana "şifreleme" yöntemi olduğunu eklemeliyiz 8 ^)
Zane

53
@OllieFord: Şaka gibi. Modülün yapacağı her şey, stdlib içine yerleştirilmiş olsa bile, kaynak kodunu karıştırmaktan rot13'ü sıfırdan uygulamaya kadar, Python'un Zen'ini doğrudan ihlal ediyor. Tim Peters, Zen'in içine bazı ince şakalar da soktu (TOOWTDI hattındaki çizgilerin iki farklı yolla yapıldığına dikkat edin).
abarnert

7
Ben modülün ismini düşünüyorum @abarnert, thisayrıca diğer diller (örn Java) kullandıkları için şaka bir parçasıdır thisnasıl Python kullanımlara benzer self. Yazma import thissadece yazarak anlamsız olarak görünüyor import java.self;.
Luc

25

ROT13 ikamesini elle - veya kafanızda - yapmak istiyorsanız, 13 * 2 = 26 (İngiliz alfabesinin harflerinin sayısı), aslında bir değişim olduğunu kontrol edebilirsiniz:

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.



11

ROT13 kodlaması kullanır . Bu bir şaka olduğu için kullanılır.

Dizenin kodunu çözmek için Python işlevlerini de kullanabilirsiniz.

Yalnızca Python 2:

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

Python 2 ve 3:

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

Bu 2 Mayıs 11 kullanarak ncoghlan yorum tarafından fark edildi import codecs. Codec'leri içe aktarmanın hala gerekli olup olmadığını veya decodebelirli bir Python sürümü ile kullanılabilirliğinin otomatik olarak yapılıp yapılmadığını bilmiyorum . Kullandığınız belgelere bağlanabilir misiniz decode?
Cœur

1
@ Cœur Bu benim için IDLE Python 3.7 de çalışmaz. Belki de bu Python 2'ydi?
Filip Š

@ FilipŠ oh, haklısınız, Python 2 ile çalışır, ancak Python 3 ile çalışmaz. Ancak Python 2'de bunu yapabilirsiniz import thisve herhangi bir ek kod olmadan doğrudan yazdıracaktır.
Cur

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.