Mã nguồn của mô-đun này, mô-đun này làm gì?


191

Nếu bạn mở một trình thông dịch Python và gõ "nhập cái này", như bạn biết, nó sẽ in:

Zen của Python, bởi Tim Peters

Đẹp thì tốt hơn xấu.
Rõ ràng là tốt hơn so với ngầm.
Đơn giản là tốt hơn phức tạp.
Phức tạp tốt hơn phức tạp.
Bằng phẳng là tốt hơn so với lồng nhau.
Thưa thì tốt hơn dày đặc.
Tính dễ đọc.
Trường hợp đặc biệt không đủ đặc biệt để phá vỡ các quy tắc.
Mặc dù thực tế đánh bại sự tinh khiết.
Lỗi không bao giờ nên âm thầm vượt qua.
Trừ khi im lặng rõ ràng.
Trước sự mơ hồ, hãy từ chối sự cám dỗ để đoán.
Nên có một-- và tốt nhất là chỉ có một cách rõ ràng để làm điều đó.
Mặc dù cách đó ban đầu có thể không rõ ràng trừ khi bạn là người Hà Lan.
Bây giờ tốt hơn bao giờ hết.
Mặc dù không bao giờ thường tốt hơnngay bây giờ
Nếu việc thực hiện khó giải thích, đó là một ý tưởng tồi.
Nếu việc thực hiện dễ giải thích, nó có thể là một ý tưởng tốt.
Không gian tên là một ý tưởng tuyệt vời - hãy làm nhiều hơn nữa!

Trong nguồn python (Lib / this.py) văn bản này được tạo bởi một đoạn mã tò mò:

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

Câu trả lời:


183

Đây được gọi là mã hóa rot13 :

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

Xây dựng bảng dịch, cho cả chữ hoa (đây là chữ 65 dành cho) và chữ thường (đây là chữ 97 dành cho) ký tự.

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

In chuỗi dịch.


27
Và điều đó thực sự có thể được thực hiện đơn giản hơn trong cả 2.x và 3.x như import codecs; print(codecs.decode(s, "rot-13")). Viết thuật toán ra bằng tay như thế chỉ là làm xáo trộn thêm quả trứng Phục sinh.
ncoghlan

12
Hoặc chỉ 'Gur Mra bs Clguba, ol Gvz Crgref'.decode('rot13').
Alex Brasetvik

3
Có lẽ chúng ta nên thêm rằng ROT13 là phương thức "mã hóa" chính được sử dụng trong usenet cũ ngày 8 ^)
Zane

53
@OllieFord: Như một trò đùa. Mọi thứ mà mô-đun làm, từ việc làm xáo trộn mã nguồn đến việc thực hiện rot13 từ đầu mặc dù nó được tích hợp vào stdlib, vi phạm trực tiếp Zen của Python. Tim Peters cũng có một số trò đùa tinh tế vào chính Zen (chú ý các dấu gạch ngang trên dòng TUYỆT VỜI làm theo hai cách khác nhau?).
abarnert

7
@abarnert Tôi nghĩ tên của mô-đun, thiscũng là một phần của trò đùa vì các ngôn ngữ khác (ví dụ Java) sử dụng thistương tự như cách Python sử dụng self. Gõ có import thisvẻ vô nghĩa như gõ import java.self;.
Luc

25

Nếu bạn muốn thực hiện thay thế ROT13 bằng tay - hoặc trong đầu - bạn có thể kiểm tra xem vì 13 * 2 = 26 (số chữ cái của bảng chữ cái tiếng Anh), về cơ bản đó là một nút giao:

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 eBay



11

Nó sử dụng mã hóa ROT13 . Điều này được sử dụng bởi vì nó là một trò đùa.

Bạn cũng có thể sử dụng các hàm Python để giải mã chuỗi.

Chỉ Python 2:

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

Python 2 & 3:

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

Điều này đã được chú ý bởi bình luận của ncoghlan vào ngày 2 tháng 11 năm 11 bằng cách sử dụng import codecs. Tôi không biết việc nhập codec vẫn còn cần thiết hay liệu tính khả dụng của decodeđược thực hiện tự động với một số bản phát hành cụ thể của Python. Bạn có thể liên kết đến tài liệu decodemà bạn đang sử dụng không?
Cœur

1
@ Cœur Điều này cũng không hoạt động với tôi trong Python 3.7 trong IDLE. Có lẽ đây là Python 2?
Filip

@ FilipŠ oh, bạn nói đúng, nó hoạt động với Python 2 nhưng không phải với Python 3. Nhưng trong Python 2, bạn chỉ có thể làm import thisvà nó sẽ in trực tiếp mà không cần thêm mã.
Cœur

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.