リストの内包表記の続き あとジェネレータ式
昨日は忘れてたけど、
[ (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, だけでもいいみたいだったけど。