Pythonラムダ関数をマスターする:実例とベストプラクティス
Pythonラムダ関数をマスターする:実例とベストプラクティス
ラムダ関数は「無名関数」とも呼ばれ、小さな使い捨てルーチンを1行で記述できます。map、filter、reduceと組み合わせると特に便利で、関数型スタイルのコードで威力を発揮します。
ラムダ関数とは?
ラムダはdefの代わりにlambdaキーワードで定義される関数です。ゼロ個以上のパラメータを取り、単一の式の値を返します。本体が式であるため、ラムダには文や複数行を含められません。
すべてのラムダには3つの要素があります:
lambdaキーワード- 1つ以上のパラメータ(カンマ区切り)
- 戻り値を生成する単一の式
例: lambda x, y: x + yは2つの数を加算します。無名ですが、変数に代入したり、他の関数に渡したり、即座に呼び出したりできます。
ラムダの書き方
形式的な構文:
lambda p1, p2, ... : expression
パラメータの周りに括弧がないことに注意してください。式には有効なPython操作をすべて使用できます。
例1: シンプルな加算
adder = lambda x, y: x + y print(adder(1, 2)) # → 3
例2: ラムダオブジェクトの検査
string = 'some kind of a useless lambda' print(lambda string: print(string)) # → <function <lambda> at 0x...>
ここではラムダが呼び出されず、printがラムダの返す関数オブジェクトを表示しています。
例3: 即時実行ラムダ(IIFE)
(lambda x: print(x))('IIFE in action') # → IIFE in action
定義を括弧で囲み、その後に括弧を追加することで即座にラムダを呼び出します。
例4: ラムダ vs 通常の関数
# 通常の関数
def printer(arg):
return print(arg)
# 関数を呼び出すラムダ
guru(lambda: printer('Lambda call')) # → Lambda call
両方とも同じ出力ですが、ワンショットの呼び出しのみが必要な場合、ラムダ版の方が簡潔です。
組み込み関数とのラムダ活用
ラムダは高階関数へのコールバックとして渡すときに真価を発揮します。一般的なパターンを以下に示します。
Pythonにおける即時実行関数式(IIFE)
(lambda x: x + x)(2) # → 4
filter
filter関数は述語を満たす要素を保持します。
sequences = [10, 2, 8, 7, 5, 4, 3, 11, 0, 1] filtered = filter(lambda x: x > 4, sequences) print(list(filtered)) # → [10, 8, 7, 5, 11]
map
map関数は各要素を変換します。
sequences = [10, 2, 8, 7, 5, 4, 3, 11, 0, 1] squared = map(lambda x: x * x, sequences) print(list(squared)) # → [100, 4, 64, 49, 25, 16, 9, 121, 0, 1]
reduce
reduceを使ってシーケンスから単一の値を累積します。
from functools import reduce sequences = [1, 2, 3, 4, 5] product = reduce(lambda x, y: x * y, sequences) print(product) # → 120
ラムダを使うべき時・避けるべき時
ラムダは単一の式に収まる簡潔なワンショット操作に最適です。mapやfilterのような関数型プログラミング構成でよく使われます。
しかし、本番コードで過度に複雑なラムダは避けてください。長く読みにくいワンライナーは保守性を損ないます。そのような場合は、明確なdocstringを持つ名前付き関数が望ましいです。
ラムダ vs 通常の関数
| 特徴 | ラムダ | 通常の関数 |
|---|---|---|
| 構文 | lambda x: x + x | def add(x): return x + x |
| 本体 | 単一の式のみ | 複数の文を許可 |
| 命名 | 無名(識別子なし) | 名前が必要 |
| 戻り値 | 式から暗黙的に | returnで明示的に |
| ユースケース | 短い使い捨てロジック | 再利用可能な複雑なロジック |
まとめ
- 単一式のコンパクトな関数にはラムダを使用する
- ロジックが複雑または再利用可能な場合は名前付き関数を推奨
- コードを読みやすく保つ;賢さよりシンプルさを優先
Python
- C++演算子オーバーロード:コード例付き実践ガイド
- C++関数を実例で徹底解説:基本から応用まで
- Python 関数引数完全マスター: 位置引数・キーワード引数・デフォルト引数
- Python ラムダ関数: 無名関数の実践ガイド
- Pythonクロージャ解説:ネスト関数が変数を捕捉する仕組み
- Python print()関数の実践ガイド:基本から応用まで
- Python strip()メソッド完全ガイド:実践例付き
- Python str.count()マスター:文字と部分文字列のカウント実例集
- Python format()文字列を明確な例でマスター
- Python String.find()メソッド完全ガイド:構文、例、代替手法
- Python abs()関数:数値と複素数の絶対値を計算