無名関数

Definition:anonymous function

無名関数とは、名前(識別子)を持たず、引数と処理内容だけを直接記述して定義される関数である。多くの言語では「ラムダ式(lambda expression)」ともほぼ同義に扱われる。

解説

通常の関数は、例えば f(x) = x + 1 のように f という名前を付けて定義し、以後はその名前を通じて呼び出す。これに対して無名関数は、x を受け取って x + 1 を返すという処理内容だけを、名前を介さずその場に記述する。

数学の写像記法では、これを x ↦ x + 1 のように名前なしで表現できる。この考え方を形式化したのが、Alonzo Churchが1930年代に導入したラムダ計算(λ-calculus)であり、同じ関数は λx.x + 1 と記述される。プログラミング言語における「ラムダ(lambda)」という呼称は、この記法に由来する。

各言語での無名関数の記法例:

  • Python: lambda x: x + 1
  • JavaScript: x => x + 1(アロー関数)または function(x) { return x + 1; }(無名の関数式)
  • Java(8以降): x -> x + 1
  • C++(11以降): [](int x) { return x + 1; }
  • Ruby: lambda { |x| x + 1 } または ->(x) { x + 1 }

無名関数は、次のような用途で利用されることが多い。

  • 他の関数に処理を引数として渡す場合(map、filter、reduce などの高階関数への処理の受け渡し)
  • ソート処理の比較関数やイベントハンドラなど、一度きりしか使わないコールバック処理
  • 定義後ただちに実行する即時実行関数式(IIFE: Immediately Invoked Function Expression)

無名関数は変数に代入して利用することもできる。例えば Python で f = lambda x: x + 1 と書けば、以後 f(2) のように呼び出せる。ただしこの場合も、関数の値そのものは名前を持たずに定義されており、変数 f がその値を参照しているに過ぎない点で、def f(x): return x + 1 による通常の関数定義とは区別される。

また無名関数は、定義された時点のスコープにある変数を捕捉するクロージャ(closure)として機能することが多く、この性質は関数型プログラミングにおいて多用される。

名前付き関数との違い

名前の有無

# lambda:通常は無名(変数代入すれば名前は付くが本質的には無名)
square = lambda x: x ** 2

# def:定義時に必ず名前を持つ
def square(x):
return x ** 2

本体の制約

# lambda:単一式のみ。文(statement)は書けない
add = lambda x, y: x + y # OK
# bad = lambda x: print(x); return x # NG(構文エラー)

# def:複数行の文を自由に書ける
def add(x, y):
result = x + y
print(f"計算結果: {result}")
return result

returnの扱い

# lambda:式の評価結果が自動的に返る(returnは書かない)
square = lambda x: x ** 2

# def:明示的にreturnが必要
def square(x):
return x ** 2

Mathematics is the language with which God has written the universe.





















数理統計学 機械学習