Pythonで遊んでたら疑問点が・・・
リスト内包便利ですね。
[ x**2 for x in range(10) ]
と、配列の中に処理を書ける。
この式の場合、1から10までの数について、それぞれ2乗した数の配列を得ることができます。Perlでいうmap関数みたいなものですね。ほぼそのものか。
if文で条件をつけることもできますね。
[ x**2 for x in range(10) if x**2 % 4 == 0 ]
とすると、2乗が4で割り切れるものだけ含んだ配列を作成することができる。
結果をリストに格納して返してくれるわけだから、リストに格納できるものであれば、なんでもx**2の部分にかけるはず。
ちょっと意地悪して、lambda式を格納してみました。
>>>lams = [ lambda l,m : l * x + m for x in range(10) ] >>>[ lam( 1, 5 ) for lam in lams ] [14, 14, 14, 14, 14, 14, 14, 14, 14, 14]
おやー?予想と違う結果が返ってきた。
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
みたいな結果になると思ってたのに。lambdaの実装が関係してるのかな?リスト内包の展開が終わったあとに関数が作成される?
ためしにリスト内包を使わないで書いてみる。
>>>lams = [ lambda l,m : l * 0 + m , lambda l,m : l * 1 + m , lambda l,m : l * 2 + m ] >>>[ lam( 1, 5 ) for lam in lams ] [5, 6, 7]
おっと、ちゃんと返ってくるナァ。うーん、これはバグなの?それともオレがおかしいの?