状況に合わせて使い分ける:クロージャーとラムダ式
2024-07-27
クロージャーとラムダ式の違い
共通点:
- どちらもコードをブロックとして表現する方法を提供します。
- どちらも関数定義と似ていますが、名前がありません。
- どちらも他の関数に引数として渡したり、変数に格納したりできます。
相違点:
変数へのアクセス:
- クロージャー:
- 外側のスコープにある変数を参照し、変更できます。
- 外側のスコープの変数へのアクセスによって、状態を保持することができます。
- ラムダ式:
- 外側のスコープにある変数を参照することはできますが、変更することはできません。
- 外側のスコープの変数への参照は、読み取り専用です。
再帰:
- クロージャー:
- 自身を再帰的に呼び出すことができます。
- 状態を保持できるため、再帰的な処理に適しています。
- ラムダ式:
- 再帰的な処理には使用できません。
実装:
- クロージャー:
- 多くの場合、匿名関数として実装されます。
- 言語によっては、特別な構文を使用して定義することもできます。
- ラムダ式:
- 簡潔な構文を使用して定義されます。
- 多くの言語でサポートされています。
例:
# クロージャー
def outer_function(x):
def inner_function(y):
return x + y
return inner_function
closure = outer_function(10)
print(closure(5)) # 出力: 15
# ラムダ式
def outer_function(x):
return lambda y: x + y
lambda_function = outer_function(10)
print(lambda_function(5)) # 出力: 15
- クロージャーは、状態を保持できる関数オブジェクトです。
- ラムダ式は、簡潔な構文で書ける匿名関数です。
- クロージャーは再帰的に呼び出すことができますが、ラムダ式はできません。
- クロージャーは変数を変更できますが、ラムダ式は変数を読み取ることしかできません。
どちらを使用するかは、状況によって異なります。
- 状態を保持する必要がある場合は、クロージャーを使用します。
- 簡潔なコードを書きたい場合は、ラムダ式を使用します。
クロージャー
def outer_function(x):
def inner_function(y):
return x + y
return inner_function
closure = outer_function(10)
# クロージャーは、外側のスコープにある変数 `x` を参照できます。
print(closure(5)) # 出力: 15
# クロージャーは、外側のスコープにある変数 `x` を変更できます。
closure.x = 20
print(closure(5)) # 出力: 25
ラムダ式
def outer_function(x):
return lambda y: x + y
lambda_function = outer_function(10)
# ラムダ式は、外側のスコープにある変数 `x` を参照できます。
print(lambda_function(5)) # 出力: 15
# ラムダ式は、外側のスコープにある変数 `x` を変更できません。
# lambda_function.x = 20 # エラーが発生します
再帰
# クロージャーは再帰的に呼び出すことができます。
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n - 1)
print(factorial(5)) # 出力: 120
# ラムダ式は再帰的に呼び出すことができません。
# lambda_factorial = lambda n: n * lambda_factorial(n - 1) # エラーが発生します
# クロージャーは、変数へのアクセス権によって、異なる動作をすることができます。
def outer_function(x):
def inner_function(y):
return x + y
# 読み取り専用
closure_read = outer_function(10)
print(closure_read(5)) # 出力: 15
# 書き込み可能
closure_write = outer_function(10)
closure_write.x = 20
print(closure_write(5)) # 出力: 25
# ラムダ式は、変数へのアクセス権が常に読み取り専用です。
lambda_function = lambda y: x + y
print(lambda_function(5)) # 出力: 15
# lambda_function.x = 20 # エラーが発生します
クロージャーとラムダ式の違いを説明する他の方法
メタファー
- クロージャー:
- 魔法使いのように、外側のスコープから情報を呼び出すことができます。
- 秘密の部屋のような、外側から見えない状態を保持することができます。
- ラムダ式:
- 短冊のような、簡潔なコードで書かれています。
- 使い捨ての道具のような、一度だけ使用して捨てられます。
図
- クロージャー:
- 外側のスコープと内側のスコープが円で表されています。
- 内側のスコープは、外側のスコープにある変数にアクセスできます。
- ラムダ式:
- 単一の円のみで表されています。
対話形式
- クロージャー: ファイルを読み込み、その内容を処理する関数
- ラムダ式: リストの要素をフィルタリングする関数
function lambda functional-programming