done is better than perfect

自分が学んだことや、作成したプログラムの記事を書きます。すべての記載は他に定める場合を除き個人的なものです。

Pythonのtuple内包表記の落とし穴

タイトルは釣りです。というかあると思ってたら落とし穴に引っかかりました。

以下のコードを実行すると……

t = (x for x in range(4))

for x in t:
    print x

for x in t:
    print x

出力

0
1
2
3

二回目のfor文が実行されていません。なんでやねん。 なまじエラーの出力も無いものだから、結構気付くのが遅れました。

色々調べてみた結果わかりました。このtはtupleじゃなくて ジェネレータ になっていたのです。

t = (x for x in range(4))
print t

出力

<generator object <genexpr> at 0x1012f0320>

つまり、最初の例で言うと、最初のfor文でジェネレータを消費しきっていたために 二回目のfor文では何も返されなかったのです。

tupleが欲しい場合は素直に

t = tuple([x for x in range(4)])

と書きましょう。