ซอร์สโค้ดของโมดูล“ นี่” กำลังทำอะไร


193

หากคุณเปิดล่าม Python และพิมพ์ "import this" ดังที่คุณทราบมันจะพิมพ์:

The Zen of Python โดย Tim Peters

สวยดีกว่าน่าเกลียด
ชัดเจนดีกว่าโดยปริยาย
เรียบง่ายดีกว่าซับซ้อน
คอมเพล็กซ์ดีกว่าซับซ้อน
แบนดีกว่าซ้อนกัน
เบาบางดีกว่าหนาแน่น
จำนวนการอ่าน
กรณีพิเศษไม่พิเศษพอที่จะทำลายกฎ
แม้ว่าการปฏิบัติจริงชนะความบริสุทธิ์
ข้อผิดพลาดไม่ควรผ่านไปอย่างเงียบ ๆ
เว้นแต่จะปิดเสียงอย่างชัดเจน
ในการเผชิญกับความกำกวมปฏิเสธสิ่งล่อใจที่จะคาดเดา
ควรมีอย่างน้อยหนึ่งวิธีที่ชัดเจนกว่าที่จะทำ
แม้ว่าวิธีนี้อาจไม่ชัดเจนในตอนแรกเว้นแต่ว่าคุณเป็นชาวดัตช์
ตอนนี้ดีกว่าไม่เคย
แม้ว่าจะไม่เคยดีกว่าที่เหมาะสมในขณะนี้
หากการนำไปปฏิบัตินั้นยากที่จะอธิบายเป็นความคิดที่ไม่ดี
หากการนำไปปฏิบัตินั้นง่ายต่อการอธิบายอาจเป็นความคิดที่ดี
Namespaces เป็นหนึ่งในแนวคิดที่ยอดเยี่ยม - ลองทำสิ่งเหล่านี้ให้มากขึ้น

ในซอร์สไพ ธ อน (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])

คำตอบ:


184

สิ่งนี้เรียกว่าการเข้ารหัส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])

พิมพ์สตริงที่แปล


27
และที่จริงสามารถดำเนินการได้มากขึ้นเพียงทั้งใน 2.x และ 3.x import codecs; print(codecs.decode(s, "rot-13"))เป็น การเขียนอัลกอริธึมด้วยมืออย่างนั้นเป็นการทำให้งงงวยมากขึ้นของไข่อีสเตอร์
ncoghlan

12
'Gur Mra bs Clguba, ol Gvz Crgref'.decode('rot13')หรือเพียงแค่
Alex Brasetvik

3
บางทีเราควรจะเพิ่มว่า ROT13 เป็นวิธีการ "เข้ารหัส" หลักที่ใช้ในวัน Usenet เก่า 8 ^)
Zane

53
@OllieFord: เป็นเรื่องตลก ทุกสิ่งที่โมดูลทำตั้งแต่การทำให้งงงวยซอร์สโค้ดไปจนถึงการติดตั้ง rot13 ตั้งแต่เริ่มต้นแม้ว่าจะสร้างขึ้นใน stdlib ก็ตามเป็นการละเมิด Zen of Python โดยตรง Tim Peters ยังแอบมุขตลกเล็กน้อยเข้าไปใน Zen ด้วยตัวเอง (สังเกตเครื่องหมายขีดกลางบนบรรทัด TOOWTDI ทำสองวิธีที่แตกต่างกันหรือไม่?)
abarnert

7
@abarnert ผมคิดว่าชื่อของโมดูลthisยังเป็นส่วนหนึ่งของเรื่องตลกเพราะภาษาอื่น ๆ (เช่น Java) ใช้คล้ายกับงูหลามใช้this selfพิมพ์ดีดลักษณะเช่นเดียวกับการพิมพ์ไม่มีจุดหมายimport this import java.self;
Luc

25

หากคุณต้องการทดแทนROT13ด้วยมือ - หรือในหัวของคุณ - คุณสามารถตรวจสอบได้ว่าเพราะ 13 * 2 = 26 (จำนวนตัวอักษรของตัวอักษรภาษาอังกฤษ) มันเป็นการแลกเปลี่ยนที่สำคัญ:

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 ไม่ทราบว่าใครคือใคร ernq guvf



11

ใช้การเข้ารหัสROT13 มันถูกใช้เพราะมันเป็นเรื่องตลก

คุณยังสามารถใช้ฟังก์ชัน Python เพื่อถอดรหัสสตริง

Python 2 เท่านั้น:

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

Python 2 และ 3:

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

นี้ถูกพบโดยความคิดเห็น ncoghlan วันที่ 2 พฤษภาคม '11import codecsใช้ ฉันไม่ทราบว่าการนำเข้าตัวแปลงสัญญาณยังคงมีความจำเป็นหรือไม่หรือหากความพร้อมใช้งานของdecodeการสร้างอัตโนมัติโดยเฉพาะกับ Python คุณสามารถลิงค์ไปยังเอกสารของสิ่งdecodeที่คุณกำลังใช้อยู่ได้หรือไม่?
Cœur

1
@Cur นี้ยังไม่ได้ผลสำหรับฉันใน Python 3.7 ใน IDLE บางทีนี่อาจเป็น Python 2 ใช่ไหม
ฟิลิปŠ

@ FilipŠโอ้คุณพูดถูกมันใช้ได้กับ Python 2 แต่ไม่ใช่กับ Python 3 แต่ใน Python 2 คุณสามารถทำได้import thisและมันจะพิมพ์โดยตรงโดยไม่มีรหัสเพิ่มเติมใด ๆ
Cœur

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.