Pythonのコードを読んでいると、時折lambda
というキーワードが登場します。
これは「無名関数」または「ラムダ式」と呼ばれるもので、Pythonの機能をより簡潔に、そして強力に使いこなすための便利な構文です。
def
で定義する普通の関数と何が違うの?」「どんな時に使うと便利なのか、いまいちわからない・・・」
この記事では、上記のような疑問を持つ方に向けて、lambda
式の基本から、その真価が発揮される具体的な使いどころ、そしてコードの可読性を損なわないための注意点まで、初心者にもわかりやすく解説していきます。
【本記事の信頼性】
- 執筆者は元エンジニア
- 大手プログラミングスクールのWebディレクター兼ライターを経験
- 自らも地元密着型のプログラミングスクールを運営
受講生から評判の良いプログラミングスクール
スクール |
特徴 |
受講料金 |
大手比較サイトで4年連続人気NO.1!受講生からの評判も非常に高く、Web系のエンジニアを目指すならRUNTEQ一択。 | 657,000円 (最大約53万円の給付金が適用される) |
|
月単価80万円以上の現役エンジニア講師による指導!一度入会すればサポートは半永久的。 | 498,000円 |
|
格安で質の高いWeb制作スキルを習得したい人におすすめ!業界最安級の料金でありながら、コミュニティやサポートが充実。 | 129,800円~ |
|
完全無料でプログラミングが学べる貴重なスクール!最短1ヶ月で卒業可能。ゼロスク運営会社への就職もできる。 | 完全無料 |
|
長期間に渡って学習し、希少人材を目指す人に最適なスクール!受講料は高いものの、高収入を得られる人材を目指せる。 | 96~132万円 |
Pythonの無名関数(lambda式)とは?
lambda
式とは、一言で言えば「名前を持たない、一行で書ける小さな関数」のことです。
通常の関数はdef
キーワードを使って名前を付けて定義しますが、lambda
式はその手間を省き、より手軽に関数を作成できます。
基本的な構文
lambda
式の構文は非常にシンプルです。
lambda 引数: 式
:
の左側に引数を、右側にその引数を使った式(処理内容)を記述します。この式の評価結果が、関数の戻り値となります。
通常の関数(def)との比較
例として、2つの数値を足し算する簡単な関数を、通常のdef
とlambda
の両方で書いて比較してみましょう。
まずは、おなじみのdef
を使った関数の定義です。
def add(x, y):
return x + y
result = add(3, 5)
print(result)
実行結果は以下の通りです。
8
次に、これをlambda
式で書いてみます。
add_lambda = lambda x, y: x + y
result = add_lambda(3, 5)
print(result)
もちろん、実行結果は同じです。
両者を比較すると、lambda
式には以下のような特徴があることがわかります。
def
や関数名が不要return
を書かなくても、式の評価結果が自動的に返される- 処理は一行の「式」しか書けない(複数行の処理や文は書けない)
このように、lambda
式は非常にシンプルな処理を、その場ですぐに定義したい場合に適した構文なのです。
lambda式の真価が発揮される「使いどころ」
「わざわざlambda
を使わなくても、def
で書けば良いのでは?」と思うかもしれません。
確かにその通りで、先ほどのようにlambda
式を変数に代入して使うのは、実はあまり推奨されていません。(理由は後述します)
lambda
式の本当の価値は、「他の関数の引数として、小さな関数を渡したい」という場面で最大限に発揮されます。
sorted()のkey引数で、並び替えのルールを指定する
lambda
式が最も輝く代表的な例が、リストの並び替えを行うsorted()
関数のkey
引数です。
key
引数には「何をもって並び替えるか」というルールを関数で指定します。
例えば、タプルのリストを、各タプルの2番目の要素(年齢)で昇順に並び替えたい場合を考えます。
# (名前, 年齢)のタプル
user_list = [('Suzuki', 25), ('Tanaka', 20), ('Sato', 30)]
# 各要素の2番目の値(x[1])を基準にソート
sorted_list = sorted(user_list, key=lambda x: x[1])
print(sorted_list)
実行結果は以下の通りです。
[('Tanaka', 20), ('Suzuki', 25), ('Sato', 30)]
key=lambda x: x[1]
の部分がポイントです。
sorted
はリストの各要素(タプル)を順番にx
としてlambda
式に渡し、その戻り値であるx[1]
(年齢)の値を比較して並び替えています。
この「年齢でソートする」という一度きりのルールのために、わざわざdef
で関数を定義するのは少し大げさですよね。
こんな時こそlambda
式の出番なのです。
map()で、リストの全要素に同じ処理を適用する
map()
関数は、リストなどのイテラブル(反復可能なオブジェクト)の全要素に対して、特定の関数を適用し、その結果を新しいイテラブルとして返します。
この「特定の関数」としてlambda
式がよく使われます。
numbers = [1, 2, 3, 4, 5]
# 全ての要素を2乗する
squared_numbers = map(lambda x: x * x, numbers)
# mapオブジェクトはそのままでは中身が見えないのでリストに変換
print(list(squared_numbers))
実行結果は以下の通りです。
[1, 4, 9, 16, 25]
map()
とlambda
を組み合わせることで、for
ループを書くよりも簡潔に、リスト全体の変換処理を記述できます。
filter()で、条件に合う要素だけを抽出する
filter()
関数は、map()
と似ていますが、関数を適用して戻り値がTrue
になる要素だけを抽出します。 この判定関数としてlambda
式が活躍します。
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 偶数だけを抽出する (x % 2 == 0 が True になるものだけ)
even_numbers = filter(lambda x: x % 2 == 0, numbers)
print(list(even_numbers))
実行結果は以下の通りです。
[2, 4, 6, 8, 10]
これもfor
文とif
文を組み合わせるより、ずっとスマートな書き方と言えるでしょう。
lambda式を使いこなすための注意点
lambda
式は強力なツールですが、使い方を誤ると逆にコードを読みにくくしてしまいます。
ここでは、lambda
式を扱う上での重要な注意点を解説します。
複雑な処理は書かない
lambda
式は、あくまで一行で書けるシンプルな「式」を扱うためのものです。
三項演算子を使えばif-else
の分岐も書けますが、それが複数になったり、処理が複雑になったりする場合は、無理にlambda
で書くべきではありません。
# 悪い例: ぱっと見で何をしているか分かりにくい
complex_lambda = lambda x: 'A' if x > 10 else ('B' if x > 5 else 'C')
このような場合は、素直にdef
を使って、可読性の高い通常の関数として定義しましょう。
コードを書く上での大原則は「自分以外の誰かが、後から読んでも理解できること」です。
lambda式を変数に代入するのは避ける
記事の冒頭でadd_lambda = lambda x, y: x + y
という例を挙げましたが、これはlambda
式の説明のための例であり、実際のコードでこのように書くことは推奨されていません。
なぜなら、
def add(x, y): return x + y
と書くのと比べて、lambda
を使うメリットが何もなく、むしろdef
で書いた方が関数名が明確でわかりやすいからです。
また、エラーが発生した際も、def
で定義した関数はエラーメッセージにその名前が表示されるため、デバッグがしやすいという利点もあります。
まとめ
今回は、Pythonの無名関数lambda
式について、その基本から実践的な使い方、注意点までを解説しました。
なお、Pythonを体系的に学んだり、Pythonのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。