2.1 ラムダ関数の定義
ラムダ関数、つまり無名関数っていうのは、 名前のないコンパクトなワンライナー関数のことだよ。 lambdaキーワードを使って作れるんだ。
普通の関数はdefで定義するけど、ラムダ関数はその場でパッと作れて、 簡単な1行で済むような操作に使われることが多いんだ。
ラムダ関数の書き方は、lambdaキーワードの後に引数を置いて、コロン、 最後に式を書くんだ。
lambda args: expression
ラムダ関数には好きなだけ引数を渡せるけど、式は1つだけだよ。 その式の結果が自動で返されるってわけ。
例:
| ラムダ関数 | 普通の関数 |
|---|---|
|
|
|
|
|
|
2.2 ラムダ関数の使い方
ラムダ関数っていうのはmap()、filter()、 sorted()みたいな他の関数と一緒に使われたり、 他の関数の引数として使われることが多いんだ。
map()と一緒に使う
map()関数は指定した関数をイテラブルオブジェクトの各要素に適用して、 結果のイテレータを返すんだ。map()とは相性バッチリだよ、 要素を変換するための関数を簡潔に定義できるからね。
numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x ** 2, numbers))
print(squared_numbers) # 出力: [1, 4, 9, 16, 25]
filter()と一緒に使う
filter()関数は指定した関数がTrueを返す要素だけで構成された イテレータを返すんだ。ラムダ関数を使うと、フィルタリングの条件を パッと定義できるから便利だよね。
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 出力: [2, 4, 6, 8, 10]
sorted()と一緒に使う
sorted()関数はイテラブルオブジェクトの要素をソートするんだ。 ラムダ関数を使って、key引数を使ったカスタムソート条件を 定義することもできるよ。
words = ["banana", "apple", "cherry", "date"]
sorted_words = sorted(words, key=lambda x: len(x))
print(sorted_words) # 出力: ['date', 'apple', 'banana', 'cherry']
式の中でのラムダ関数
ラムダ関数は他の式の中でも使えるんだ。例えばリスト内包表記や 辞書生成器なんかでもね。
pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
pairs.sort(key=lambda pair: pair[1])
print(pairs) # 出力: [(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]
2.3 ラムダ関数の制限
ラムダ関数は普通の関数に比べていくつか制限があるんだ。
式の制限:
ラムダ関数には1つの式しか含められないし、 ループとかif、elseみたいな 制御文は使えないんだ。
ドキュメントの欠如:
ラムダ関数にはドキュメント文字列(docstring)が含められないから、 その機能をドキュメント化するのが難しいんだよね。
デバッグの限界:
名前やドキュメントがないから、ラムダ関数は普通の関数に比べて デバッグがやりにくいんだ。
ラムダ関数の制限の例
ラムダ関数の中で複数の式を使おうとするとシンタックスエラーになるよ:
# このコードはエラーになるよ
invalid_lambda = lambda x: x ** 2; print(x)
GO TO FULL VERSION