「クロージャ」と「ラムダ」の違いは何ですか? 質問する

「クロージャ」と「ラムダ」の違いは何ですか? 質問する

誰か説明してもらえますか? 基本的な概念は理解していますが、互換的に使用されているのをよく見かけ、混乱してしまいます。

さて、ここまで来たら、通常の関数とどう違うのでしょうか?

ベストアンサー1

ラムダ単なる匿名関数、つまり名前なしで定義された関数です。Scheme などの一部の言語では、ラムダは名前付き関数と同等です。実際、関数定義は、ラムダを内部的に変数にバインドするように書き直されます。Python などの他の言語では、ラムダと関数の間にはいくつかの (むしろ不必要な) 区別がありますが、それ以外は同じように動作します。

クロージャとは、定義された環境閉じる関数です。つまり、パラメータ リストにない変数にアクセスできます。例:

def func(): return h
def anotherfunc(h):
   return func()

これはエラーを引き起こします。なぜなら、 は環境上で閉じられfuncず、未定義だからです。はグローバル環境上でのみ閉じられます。 これは機能します:anotherfunchfunc

def anotherfunc(h):
    def func(): return h
    return func()

ここで、funcは で定義されておりanotherfunc、Python 2.3以降(またはこれと同数)ではクロージャがほぼ正しくなったため(ミューテーションはまだ機能しない)、 の環境を閉じて その中の変数にアクセスできることを意味しますanotherfunc。Python 3.1以降では、 を使用するとミューテーションも機能します。キーワードnonlocal

もう 1 つの重要な点は、で評価されなくなった後も、 の環境をfunc閉じ続けることです。次のコードも機能します。anotherfuncanotherfunc

def anotherfunc(h):
    def func(): return h
    return func

print anotherfunc(10)()

10 が印刷されます。

お気づきのとおり、これはlambdaとは何の関係もありません。これらは 2 つの異なる (ただし関連のある) 概念です。

おすすめ記事