なにかあったら「えせはら あっと Gmail」まで送って頂ければ幸いです。
株式会社マリーチでは、Pythonやdjango、また自然言語処理を使ったお仕事を探しています
さて、Pythonistaには闇Pythonistaと白Pythonistaがいるのはご存知でしょうか。というのも、俺が勝手に今作ったので、始めて聞いたという人も多いのではないでしょうか。
白Pythonistaとは、それこそPEP8とZen of Pythonを厚く信奉し、日々明晰なコードかつ読みやすいコードを心がける人々のことではありますが、しかし、闇Pythonistaはそのような暑苦しく、ユーモアの欠けた人々に対して、Pythonに自由を求める人達です。「何がやり方はできるだけ一つだ、気取ってるんじゃねえ」というわけですね。
まず、闇Pythonistaであるならば、Lambdaを使いこなすべきでしょう。Lambdaこそが、自由を求める闇Pythonistaが生み出した情念のシンタックスであるといっても過言ではないでしょう。それに三項演算子が組み合わさることにより、闇Pythonistaが生まれたといっても言い過ぎではないでしょう。
なぜ、Lambdaと三項演算子が邪悪なのか?については、例えば次のようなシンタックスを考えてみればわかると思います。
>>> test = lambda x: x + 1 if x % 2 == 0 else x * 2 >>> test(2) 3 >>> test(3) 6
これは、lambdaに偶数が入ってきたならプラス1した数を、奇数が入ってきたなら2倍にした値を返すというコードです。このへんで何やら不吉な予感がしませんか?
さて、上記のlambdaなのですが、これを変数に入れずに使いたい!と思いませんか?思いますよね。ということで本当に無名関数として使う方法があります。それが()を使うという方法です。
>>> (lambda x: x + 1 if x % 2 == 0 else x * 2)(2) 3 >>> (lambda x: x + 1 if x % 2 == 0 else x * 2)(3) 6
この()で何が起きているか、といえば、この中で一回構文を解釈して、インスタンスにしてあげているわけです。ですから、例えばこういうのもできたりします。
>>> (c for c in range(10)).next() 0
段々と不吉なコードになってきましたね。
さて、Pythonはインデント構文を基本的に使うわけですが、実は";"というのが使えたりします。例えば次のようなコードなんかが書けたりします。
>>> a = 0;b = 1;c = a + b;print c
1
ただ残念なことに、一つのシンタックスにしか使えない。これでは関数が定義できなかったりするようなので、下のような方法を取る必要があります。
>>> exec("def hoge():\n x = 1\n while 1:\n x += 1\n yield x\nprint hoge") <function hoge at 0xb771d87c>
execの中の文字列では、改行コードが使えるので、上のような書き方をすることによって、関数を定義できたりするわけです。だから、下のような書き方が可能になります。
>>> exec("def hoge():\n x = 1\n while 1:\n x += 1\n yield x");fuga = hoge();fuga.next() 2
そこまでして一行で関数を書きたいのか、とツッコミを喰らうようなコードになりましたが、ワンライナーテクニックとして覚えておいて損は無いかなとは思います。
さて、簡単に闇PythonistaになるためのTipsを教えました。他にも、闇PythonistaになるためのTipsは多くあるので、読んでみるといいかもしれません。
Powerful Python One-Liners - Python Wiki
This person has moved | Computer Science Department at Princeton University
闇Pythonistaが夢見るものとは、インデントからの開放であり、読みにくさへの挑戦であるとも言えるでしょう。