リスト内包とジェネレータ式の実行タイミングのメモ
以下のジェネレータ関数を定義する。
def G() : g = 0 for i in range(10) : g = g+1 print 'yield' yield g
で、実行。
>>> ii = [x for x in G()] yield yield yield yield yield yield yield yield yield yield >>> p = (x for x in G() ) >>> for y in p : ... print y ... yield 1 yield 2 yield 3 yield 4 yield 5 yield 6 yield 7 yield 8 yield 9 yield 10
リスト内包『 ii = [x for x in G()] 』だと即時実行。ジェネレータ式『 p = (x for x in G() ) 』だとその場では実行されない。G()が大量にデータを返すような場合だと、リスト内包はメモリ食いまくるかも(想像)。
追記
p = (x for x in G() ) は p = G()でも可。元がp = (x for x in G() if x != 5 )のようなコードだったため、このように表記しているだけ。