リスト内包とジェネレータ式の実行タイミングのメモ

以下のジェネレータ関数を定義する。

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 )のようなコードだったため、このように表記しているだけ。