ラムダは実際には関数型プログラミングのアイデアから生まれた非常に強力な構造であり、Pythonの近い将来に簡単に修正、再定義、または削除されることは決してありません。関数をパラメーターとして渡すことができるため、より強力なコードを作成するのに役立ちます。したがって、関数は第一級市民としての考え方になります。
ラムダは混乱する傾向がありますが、しっかりとした理解が得られたら、次のようなクリーンでエレガントなコードを記述できます。
squared = map(lambda x: x*x, [1, 2, 3, 4, 5])
上記のコード行は、リスト内の数値の2乗のリストを返します。もちろん、次のようにすることもできます。
def square(x):
return x*x
squared = map(square, [1, 2, 3, 4, 5])
前者のコードの方が短いことは明らかです。これは、map関数(または関数をパラメーターとして受け取る同様の関数)を1か所でのみ使用する場合に特に当てはまります。これにより、コードがより直感的でエレガントになります。
また、@ David Zaslavskyが彼の回答で述べたように、リスト内包表記は、特にリストがいくつかのあいまいな数学的方法から値を取得する必要がある場合は、必ずしもうまくいくとは限りません。
より実用的な観点から、私にとってラムダの最大の利点の1つは、最近GUIとイベント駆動型プログラミングにあります。Tkinterのコールバックを見ると、それらが引数として取るのは、それらをトリガーしたイベントだけです。例えば
def define_bindings(widget):
widget.bind("<Button-1>", do-something-cool)
def do-something-cool(event):
#Your code to execute on the event trigger
では、渡す引数があったらどうなるでしょうか。マウスクリックの座標を格納するために2つの引数を渡すのと同じくらい簡単なもの。あなたはこのように簡単にそれを行うことができます:
def main():
# define widgets and other imp stuff
x, y = None, None
widget.bind("<Button-1>", lambda event: do-something-cool(x, y))
def do-something-cool(event, x, y):
x = event.x
y = event.y
#Do other cool stuff
これはグローバル変数を使用して実行できると主張できますが、特にグローバル変数が特定の場所でのみ使用される場合は、メモリ管理とリークについて心配して頭を悩ませたいですか?それはただ貧弱なプログラミングスタイルでしょう。
要するに、ラムダは素晴らしく、過小評価されるべきではありません。PythonラムダはLISPラムダと同じではありませんが(より強力です)、Pythonラムダを使用して実際に多くの魔法のようなことを行うことができます。