Stack Overflow ( Zen of Python ) に関する別の質問を読んでいたところ、Jaime Soriano の回答で次の行に出くわしました。
import this
"".join([c in this.d and this.d[c] or c for c in this.s])
上記を Python シェルに入力すると、次のように出力されます。
"The Zen of Python, by Tim Peters\n\nBeautiful is better than ugly.\nExplicit is
better than implicit.\nSimple is better than complex.\nComplex is better than
complicated.\nFlat is better than nested.\nSparse is better than dense.
\nReadability counts.\nSpecial cases aren't special enough to break the rules.
\nAlthough practicality beats purity.\nErrors should never pass silently.
\nUnless explicitly silenced.\nIn the face of ambiguity, refuse the temptation to
guess.\nThere should be one-- and preferably only one --obvious way to do it.
\nAlthough that way may not be obvious at first unless you're Dutch.\nNow is
better than never.\nAlthough never is often better than *right* now.\nIf the
implementation is hard to explain, it's a bad idea.\nIf the implementation is
easy to explain, it may be a good idea.\nNamespaces are one honking great idea
-- let's do more of those!"
そしてもちろん、私は上記のリストを理解するために午前中を費やすことを余儀なくされました... 理解... こと。難読化されていることをきっぱりと宣言することをためらっていますが、それは、プログラミングを始めてわずか 1 か月半であり、そのような構造が Python で一般的であるかどうかについて確信が持てないためです。
this.s
上記の印刷物のエンコードされたバージョンが含まれています。
"Gur Mra bs Clguba, ol Gvz Crgref\n\nOrnhgvshy vf orggre guna htyl.\nRkcyvpvg vf orggre guna vzcyvpvg.\nFvzcyr vf orggre guna pbzcyrk.\nPbzcyrk vf orggre guna pbzcyvpngrq.\nSyng vf orggre guna arfgrq.\nFcnefr vf orggre guna qrafr.\nErnqnovyvgl pbhagf.\nFcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx gur ehyrf.\nNygubhtu cenpgvpnyvgl orngf chevgl.\nReebef fubhyq arire cnff fvyragyl.\nHayrff rkcyvpvgyl fvyraprq.\nVa gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff.\nGurer fubhyq or bar-- naq cersrenoyl bayl bar --boivbhf jnl gb qb vg.\nNygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh'er Qhgpu.\nAbj vf orggre guna arire.\nNygubhtu arire vf bsgra orggre guna *evtug* abj.\nVs gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.\nVs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn.\nAnzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f qb zber bs gubfr!"
そしてthis.d
、デコードする暗号を含む辞書が含まれていますthis.s
:
{'A': 'N', 'C': 'P', 'B': 'O', 'E': 'R', 'D': 'Q', 'G': 'T', 'F': 'S', 'I': 'V', 'H': 'U', 'K': 'X', 'J': 'W', 'M': 'Z', 'L': 'Y', 'O': 'B', 'N': 'A', 'Q': 'D', 'P': 'C', 'S': 'F', 'R': 'E', 'U': 'H', 'T': 'G', 'W': 'J', 'V': 'I', 'Y': 'L', 'X': 'K', 'Z': 'M', 'a': 'n', 'c': 'p', 'b': 'o', 'e': 'r', 'd': 'q', 'g': 't', 'f': 's', 'i': 'v', 'h': 'u', 'k': 'x', 'j': 'w', 'm': 'z', 'l': 'y', 'o': 'b', 'n': 'a', 'q': 'd', 'p': 'c', 's': 'f', 'r': 'e', 'u': 'h', 't': 'g', 'w': 'j', 'v': 'i', 'y': 'l', 'x': 'k', 'z': 'm'}
私が知る限り、Jaime のコードの実行の流れは次のように
なります。 1. ループc for c in this.s
は c に値を代入します
2. ステートメントc in this.d
が True と評価された場合、"and" ステートメントはすぐ右にあるものを実行します、この場合はthis.d[c]
.
3. ステートメントc in this.d
が False と評価された場合 (Jaime のコードでは発生しません)、「or」ステートメントは、たまたまそのすぐ右にあるものを実行します。この場合は loopc for c in this.s
です。
その流れで正しいでしょうか?
実行の順序が正しいとしても、これにはまだ多くの疑問が残ります。<1> のコードが複数の条件ステートメントの後の行の最後にあるのに、なぜ <1> が最初に実行されるのでしょうか? 言い換えれば、なぜfor
ループは実行を開始して値を代入するのに、実際にはコード実行の後の時点でしか値を返さないのでしょうか?
また、おまけとして、オランダ語に関する Zen ファイルの奇妙な行は何ですか?
追記:今さら言うのも恥ずかしいが、3秒前までグイド・ヴァン・ロッサムはイタリア人だと思っていた。彼のウィキペディアの記事を読んだ後、完全に理解していなくても、その行がそこにある理由を少なくとも理解しました.