"यह" मॉड्यूल का स्रोत कोड क्या कर रहा है?


192

यदि आप एक पायथन इंटरप्रेटर खोलते हैं, और "आयात करें" टाइप करें, जैसा कि आप जानते हैं, यह प्रिंट करता है:

टिम पीटर्स द्वारा ज़ेन ऑफ़ पायथन

सुंदर बदसूरत से बेहतर है।
निहितार्थ की तुलना में स्पष्ट है।
सरल जटिल से बेहतर है।
कॉम्प्लेक्स जटिल से बेहतर है।
फ्लैट नेस्टेड से बेहतर है।
विरल घने से बेहतर है।
पठनीयता मायने रखती है।
नियम तोड़ने के लिए विशेष मामले पर्याप्त नहीं हैं।
हालांकि व्यावहारिकता शुद्धता को हरा देती है।
त्रुटियों को कभी भी चुपचाप नहीं गुजरना चाहिए।
जब तक स्पष्ट रूप से चुप नहीं कराया जाता।
अस्पष्टता के सामने, अनुमान लगाने के प्रलोभन से इनकार करें।
वहाँ एक होना चाहिए - और अधिमानतः इसे करने के लिए केवल एक ही - स्पष्ट तरीका।
हालांकि यह तरीका पहली बार में स्पष्ट नहीं हो सकता जब तक कि आप डच न हों।
अब पहले से बेहतर है।
हालांकि कभी-कभी इससे बेहतर नहीं होता हैसही अब।
यदि कार्यान्वयन को समझाना कठिन है, तो यह एक बुरा विचार है।
यदि कार्यान्वयन की व्याख्या करना आसान है, तो यह एक अच्छा विचार हो सकता है।
नाम स्थान एक महान विचार का सम्मान कर रहे हैं - चलो उन में से अधिक करते हैं!

अजगर स्रोत (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])

जवाबों:


183

इसे रोट 13 एन्कोडिंग कहा जाता है :

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')
एलेक्स ब्रासेटविक

3
शायद हमें यह जोड़ना चाहिए कि ROT13 मुख्य "एन्क्रिप्शन" विधि थी जिसका उपयोग पुराने यूज़नेट दिनों 8 ^ में किया जाता था)
ज़ेन

53
@ ऑलीफोर्ड: एक मजाक के रूप में। सब कुछ मॉड्यूल करता है, सोर्स कोड को बाधित करने से लेकर रोट 13 को खरोंच से लागू करने के लिए भले ही यह स्टडलिब में बनाया गया हो, सीधे पायथन के ज़ेन का उल्लंघन करता है। टिम पीटर्स ने ज़ेन में ही कुछ सूक्ष्म चुटकुले भी सुनाए (नोटिस TOOWTDI लाइन पर दो अलग-अलग तरीके से करते हैं?)।
21

7
@abarnert मुझे लगता है कि मॉड्यूल का नाम, thisमजाक का हिस्सा भी है क्योंकि अन्य भाषाएं (जैसे जावा) thisपायथन का उपयोग कैसे करती हैं, इसके समान है self। टंकण import thisकेवल टाइपिंग के रूप में व्यर्थ दिखता है import java.self;
ल्यूक

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 nytbevguz naq ernq guvk Xyvatba ybbxvat grkgf jvgubhg pbzchgre uryc।



11

यह ROT13 एन्कोडिंग का उपयोग करता है । यह प्रयोग किया जाता है क्योंकि यह एक मजाक है।

स्ट्रिंग को डीकोड करने के लिए आप पायथन कार्यों का भी उपयोग कर सकते हैं।

अजगर 2 केवल:

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

अजगर 2 और 3:

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

यह 2 मई को 11'11 का उपयोग करते हुए ncoghlan टिप्पणी द्वारा देखा गया था import codecs। मुझे नहीं पता कि कोडेक्स आयात करना अभी भी आवश्यक है या यदि decodeपायथन की कुछ विशेष रिलीज के साथ उपलब्धता को स्वचालित बनाया गया था। क्या आप उस दस्तावेज़ के लिंक से लिंक कर सकते हैं decodeजिसका आप उपयोग कर रहे हैं?
करूर

1
@ C @ur यह मेरे लिए IDLE Python 3.7 में भी काम नहीं करता है। शायद यह पायथन 2 था?
फ़िलिप Fil

@ फ़िलिप ओह, आप सही कह रहे हैं, यह पायथन 2 के साथ काम करता है, लेकिन पायथन 3 के साथ नहीं। लेकिन पायथन 2 में, आप बस कर सकते हैं import thisऔर इसे बिना किसी अतिरिक्त कोड के सीधे प्रिंट कर सकते हैं ।
Cœur

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.