LoginSignup
3
1

More than 5 years have passed since last update.

"The Zen of Python"の謎について紐解く

Last updated at Posted at 2018-12-11

The Zen of Pythonとは

The Zen of Pythonとは、Pythonプログラマが持つべき心構えを簡潔にまとめたものです。全文はPythonインタプリタ上で

>>>import this

と入力すると表示できます。全文は以下のとおりです。

>>> import this
The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!

意味が気になる方は先人がいらっしゃるので是非その方の記事をお読みください。
プログラマが持つべき心構え (The Zen of Python)

thisの内部

ではthisの内部構造を見ていきましょう。


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

となっています。d(辞書型)に何か格納してからその辞書を参照しprintしているようです。
最終的にdに格納されているデータは

>>> this.d
{'A': 'N', 'B': 'O', 'C': 'P', 'D': 'Q', 'E': 'R', 'F': 'S', 'G': 'T', 'H': 'U', 'I': 'V', 'J': 'W', 'K': 'X', 'L': 'Y', 'M': 'Z', 'N': 'A', 'O': 'B', 'P': 'C', 'Q': 'D', 'R': 'E', 'S': 'F', 'T': 'G', 'U': 'H', 'V': 'I', 'W': 'J', 'X': 'K', 'Y': 'L', 'Z': 'M', 'a': 'n', 'b': 'o', 'c': 'p', 'd': 'q', 'e': 'r', 'f': 's', 'g': 't', 'h': 'u', 'i': 'v', 'j': 'w', 'k': 'x', 'l': 'y', 'm': 'z', 'n': 'a', 'o': 'b', 'p': 'c', 'q': 'd', 'r': 'e', 's': 'f', 't': 'g', 'u': 'h', 'v': 'i', 'w': 'j', 'x': 'k', 'y': 'l', 'z': 'm'}

となります。
この辞書を使い上記のsに格納された文章を読み取ってみましょう。

Gur Mra bs Clguba, ol Gvz Crgref
(The Zen of Python, by Tim Peters)

Ornhgvshy vf orggre guna htyl.
(Beautiful is better than ugly.)
...(以下略)

となります。this.sとprintされた文章の関係性はわかりました。
では次に辞書dの格納方法を調べたいのでfor文の中身を見てみましょう。

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

まず1行目65及び97はchar型において"A","a"に当たります。2行目及び3行目にて26*2回つまりアルファベット大文字小文字全52文字に別のアルファベットを割り振っています。
割り振り方としてはiが1であれば13を足し26で割った余りをcに足すという形です。なのでchar(78)であるNから始まりZまで行くと折り返しAからMで終わるという形になっています。
(追記)この暗号をROT13と言うようです。

まとめ

もし理由があってこのような形にしたのならその理由が知りたいです。
しかしこの仕様は遊び心がありとても面白いと思います。これからもPythonの謎を発掘していきたいと思います

3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1