pythonのリスト内包表記は凄い。すごく凄い。

御存知の通り、pythonにはリスト内包表記っていう便利なものがあります。

>>> [x*2 for x in range(10)]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

みたいなやつね。

>>> [[y*2 for y in range(x)] for x in range(5)]
[[], [0], [0, 2], [0, 2, 4], [0, 2, 4, 6]]

もちろん入れ子にも出来る。

>>> [x for x in range(10) if x%3 == 0]
[0, 3, 6, 9]

なんて感じでif文も仕込める。

ま、ここまでは序の口だ。

前に書いたけど、

>>> (x*3 for x in range(10)) #doctest: +ELLIPSIS
<generator object <genexpr> at 0x...>

みたいにジェネレーターを作ることも出来る。

関数にジェネレーターを渡すことも出来る。

>>> type(x for x in range(3))
<type 'generator'>

更に、

>>> {x: x*2 for x in range(5)}
{0: 0, 1: 2, 2: 4, 3: 6, 4: 8}

こうすると辞書型も作れちゃう。すごい。

さらにさらに

>>> {x for x in range(3)}
set([0, 1, 2])

集合型まで作れる!

うーむ、なんて万能な。 まだあるんじゃないかなー、こういう裏ワザ的なの。