リストの内包表記の続き あとジェネレータ式

昨日は忘れてたけど、

[ (x, y) for x in (1, 2, 3) for y in (2, 3, 4) if y % 2 == 0 ]

みたいにforをいくつも続けて2重3重x重ループにしたり、ifで絞り込んだりもできる。
上のは[(1, 2), (1, 4), (2, 2), (2, 4), (3, 2), (3, 4)]になる。


あとこれを丸カッコの中で書くとジェネレータが作れる。

gen = ( x for x in xrange(1, 100) if x % 2 == 0 )
for z in gen:
  print z # 1から100のうち偶数だけ表示

xrange()ってのはRuby範囲オブジェクトみたいなもの。頭にxの付くやつはイテレータみたいなオブジェクトを返すので、いきなり指定範囲の大きさのリストを作ってしまうrange()よりメモリ効率がいい。よく使うけどジェネレータの話とはあんまり関係ないのでごっちゃにしないように。


丸カッコで思い出したけど、タプルは丸カッコで書くのではなく、カンマで区切るだけでタプルになるとのこと。

a, b = 1, 2
(a, b) = (1, 2)

上の二つは同じ。
でも空のタプルは

()

としか書けないし、一個だけのタプルは

(1,)

こう書かないとただの1と(プログラマが)区別がつかない。代入するだけとかなら a = 1, だけでもいいみたいだったけど。