tag:crieit.net,2005:https://crieit.net/tags/%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E8%A6%8F%E7%B4%84/feed 「コーディング規約」の記事 - Crieit Crieitでタグ「コーディング規約」に投稿された最近の記事 2019-10-28T00:15:55+09:00 https://crieit.net/tags/%E3%82%B3%E3%83%BC%E3%83%87%E3%82%A3%E3%83%B3%E3%82%B0%E8%A6%8F%E7%B4%84/feed tag:crieit.net,2005:PublicArticle/15512 2019-10-27T23:39:10+09:00 2019-10-28T00:15:55+09:00 https://crieit.net/posts/The-Zen-of-Python The Zen of Python 邦訳 <h2 id="The Zen of Python"><a href="#The+Zen+of+Python">The Zen of Python</a></h2> <p>って知ってますか?</p> <p>知らないっていう人は、Pythonインタプリタを立ち上げて、<code>import this</code>しましょう。</p> <blockquote> <p>The Zen of Python, by Tim Peters</p> <p>Beautiful is better than ugly.<br /> Explicit is better than implicit.<br /> Simple is better than complex.<br /> Complex is better than complicated.<br /> Flat is better than nested.<br /> Sparse is better than dense.<br /> Readability counts.<br /> Special cases aren't special enough to break the rules.<br /> Although practicality beats purity.<br /> Errors should never pass silently.<br /> Unless explicitly silenced.<br /> In the face of ambiguity, refuse the temptation to guess.<br /> There should be one-- and preferably only one --obvious way to do it.<br /> Although that way may not be obvious at first unless you're Dutch.<br /> Now is better than never.<br /> Although never is often better than <em>right</em> now.<br /> If the implementation is hard to explain, it's a bad idea.<br /> If the implementation is easy to explain, it may be a good idea.<br /> Namespaces are one honking great idea -- let's do more of those!</p> </blockquote> <p>こんな感じのやつ。<br /> 何番煎じかわからないけれど、邦訳してみます。</p> <h2 id="The Zen of Python, by Tim Peters 日本語訳版"><a href="#The+Zen+of+Python%2C+by+Tim+Peters+%E6%97%A5%E6%9C%AC%E8%AA%9E%E8%A8%B3%E7%89%88">The Zen of Python, by Tim Peters 日本語訳版</a></h2> <ol> <li>醜いよりは美しい方がいい。</li> <li>暗黙よりは明示の方がいい。</li> <li>複雑よりも単純な方がいい。それでも、ワケわからなくなるよか複雑な方ががマシ。</li> <li>ネストするよりフラットな方がいい。</li> <li>詰め込んであるよりも空白が多い方がいい。</li> <li>読みやすさは重要だ。</li> <li>特別な場合であっても、ルールを破るに足る特別な理由にはならない。しかしながら、純粋さよりは実用性の方が大事。</li> <li>エラーを無視してはいけない。明示的に握り潰すなら別だけれども。</li> <li>曖昧さを前にして、推測で済まそうとしてはいけない。</li> <li>あることをする明白な方法が1つあり、しかも1つしかないのが好ましい。あなたがオランダ人でもない限り、はじめは明白には思えないにしても。</li> <li>やらないよりは今やった方がいい。とはいえ、やらない方が今すぐやるよりもいいことはしばしばある。</li> <li>実装を説明するのが難しいなら、それは悪いアイデアだろう。もし、実装を説明するのが簡単なら、それは良いアイデアかもしれない。</li> <li>名前空間は1つのとてもいい考え。そういうのをもっとやろう!</li> </ol> <p>ゆるっとしたコーディングや設計に関する指針で、結構ためになります。The Zen of Pythonという名前ですが、Python以外でもこの考え方は通用します。</p> <p>初心を忘れないためにも、時々<code>import this</code>するのはいいアイデアなのではないでしょうか?</p> <h2 id="そういえば"><a href="#%E3%81%9D%E3%81%86%E3%81%84%E3%81%88%E3%81%B0">そういえば</a></h2> <p><code>this.s</code>という変数にこの文章が入っています。</p> <pre><code class="python">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!""" </code></pre> <p>いわゆる換字式暗号ってやつですね。換字表は<code>this.d</code>で得られます。</p> <pre><code class="python">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'} </code></pre> <p>そこで、この暗号を復号するプログラムをPythonで書いてみてください。<br /> <code>sys.stdout</code>を<code>io.StringIO</code>とかに差し替えてから<code>import this</code>は復号プログラムを書いたとは言いませんよ。</p> <h3 id="正答例"><a href="#%E6%AD%A3%E7%AD%94%E4%BE%8B">正答例</a></h3> <pre><code class="python">print(''.join(map(lambda x: this.d.get(x, x), this.s))) </code></pre> frodo821