の続き。コメントで教えてもらったので試してみました。
自分のあたまで悩んだので血肉にすることができました。これでもう同じようなことで悩まなくて済むし、Pythonの遅延評価の仕組み、関数の部分適用、数値型エミュレートに馴染むことができました。だいぶ経験値上がった!
lambdaにデフォルト引数を使う
一番わかりやすいかなと思います。
fl = [lambda x, y = i : x * y for i in range(6)]
デフォルト引数は定義されたときの一度しか評価されないというのを利用しているんですね。
関数の部分適用
import functools fl = [functools.partial(lambda x, y: x * y, y = i) for i in range(6)]
Python2.5でしか動かないけど、これが一番かっこよくて素敵です。
カリー化!
二重lamdba
fl = [(lambda x: lambda y: x * y)(i) for i in range(6)]
lambdaを生成するときにすでに評価されてるから値が保持されるのか。
二重lamdba(mapで
forの内包表記をmapで書いた場合ということですね。
fl = map((lambda x: (lambda y: x * y)), range(6))
数値型のエミュレート
fl = [(i + 1).__rmul__ for i in range(6)]
数値型をエミュレートしたオブジェクトをリストに詰めてる、という理解でいいのかな。なるほどー、という感じでかっこいい。