誰か説明してもらえますか? 基本的な概念は理解していますが、互換的に使用されているのをよく見かけ、混乱してしまいます。
さて、ここまで来たら、通常の関数とどう違うのでしょうか?
ベストアンサー1
ラムダは単なる匿名関数、つまり名前なしで定義された関数です。Scheme などの一部の言語では、ラムダは名前付き関数と同等です。実際、関数定義は、ラムダを内部的に変数にバインドするように書き直されます。Python などの他の言語では、ラムダと関数の間にはいくつかの (むしろ不必要な) 区別がありますが、それ以外は同じように動作します。
クロージャとは、定義された環境を閉じる関数です。つまり、パラメータ リストにない変数にアクセスできます。例:
def func(): return h
def anotherfunc(h):
return func()
これはエラーを引き起こします。なぜなら、 は環境上で閉じられfunc
ず、未定義だからです。はグローバル環境上でのみ閉じられます。 これは機能します:anotherfunc
h
func
def anotherfunc(h):
def func(): return h
return func()
ここで、func
は で定義されておりanotherfunc
、Python 2.3以降(またはこれと同数)ではクロージャがほぼ正しくなったため(ミューテーションはまだ機能しない)、 の環境を閉じて その中の変数にアクセスできることを意味しますanotherfunc
。Python 3.1以降では、 を使用するとミューテーションも機能します。キーワードnonlocal
。
もう 1 つの重要な点は、で評価されなくなった後も、 の環境をfunc
閉じ続けることです。次のコードも機能します。anotherfunc
anotherfunc
def anotherfunc(h):
def func(): return h
return func
print anotherfunc(10)()
10 が印刷されます。
お気づきのとおり、これはlambdaとは何の関係もありません。これらは 2 つの異なる (ただし関連のある) 概念です。