「同じような小さな関数をいちいち def で定義するのが面倒…」「リストの中から条件に合う要素だけを取り出す処理を、もっとカッコよく書きたい!」そんなモヤモヤを一気に解消してくれるのが lambda(ラムダ式)です。
ラムダ式を使いこなせるようになると、コードはぐっとスッキリ、しかも map や filter と組み合わせることで「データに対する処理」を一行で表現できるようになります✨ ライブラリのドキュメントやOSSのコードもグッと読みやすく感じられて、Pythonの世界がさらに広がっていく感覚を味わえますよ。
ラムダ式とは、名前を付けずに作る小さな関数オブジェクトのこと。Pythonでは「無名関数」とも呼ばれます。普段使う def 関数と違って、その場でサッと作って使い捨てるイメージです。
書き方はとてもシンプル。
lambda 引数: 処理
引数を複数指定したいときは、カンマ区切りで並べるだけ。
lambda x, y: 処理
ポイントは、処理の部分は1行でしか書けないということ。複雑な処理は通常の def 関数で書くのが基本で、ラムダ式は「ちょっとした処理をさっと表現したいとき」に活躍します。
# 引数の文字列の末尾に「!」をつけてprintするラムダ式
lambda x: print(x + "!")
これだけで、引数 x を受け取って末尾に ! をつけて表示する関数オブジェクトが出来上がります。シンプルですよね😊
作ったラムダ式は変数に代入することも可能です。
func = lambda x, y: print(x + "さんは" + y + "です")
func("鈴木", "学生")
# 鈴木さんは学生です
ただし、このように変数に代入する書き方はPythonの公式スタイルガイド(PEP8)では推奨されていません。「だったら普通に def で書けばいいよね?」というのが理由です。
「こういう書き方もできる」と知識として押さえておきつつ、本来のラムダ式の使いどころは別にある、と覚えておきましょう。
ラムダ式が本領を発揮するのは、「関数を引数として受け取る関数」と組み合わせるときです。代表格が map と filter。どちらもPythonに最初から組み込まれている関数で、繰り返しオブジェクト(リストなど)に対して処理を一発で適用できます。
map は「リストの全要素に同じ処理を加えて、新しいリストを作りたい」ときに使う関数です。
names = ["田中", "鈴木", "佐藤"]
result = list(map(lambda x: x + "さん", names))
print(result)
# ['田中さん', '鈴木さん', '佐藤さん']
map 自体は map オブジェクトを返してくるので、最終的に list() でリストに変換するのを忘れずに👌
n1 = ["田中", "鈴木", "佐藤"]
n2 = ["太郎", "花子", "次郎"]
result = list(map(lambda x, y: x + y + "さん", n1, n2))
print(result)
# ['田中太郎さん', '鈴木花子さん', '佐藤次郎さん']
引数を増やせば、複数のリストから一つずつ要素を取り出して同時に処理できます。データの突き合わせがしたいときに重宝するテクニックです🤝
filter は「ある条件が True になる要素だけを取り出して、新しいリストを作りたい」ときに使う関数です。
True / False を返す)numbers = [3, 8, 12, 5, 20, 7]
result = list(filter(lambda x: x >= 10, numbers))
print(result)
# [12, 20]
「10以上」という条件に当てはまる要素だけがきれいに抽出されました。条件式を変えるだけで、簡単に応用が利きます💡
「あれ、それってリスト内包表記でも書けるよね?」と思った方、その通りです。Pythonでは同じことを複数の方法で書けることが多く、ラムダ式 + map / filter はリスト内包表記でも代用できます。
# map版
result = list(map(lambda x: x + "さん", names))
# リスト内包表記版
result = [x + "さん" for x in names]
# filter版
result = list(filter(lambda x: x >= 10, numbers))
# リスト内包表記版
result = [x for x in numbers if x >= 10]
使い分けの目安は次の通りです。
map / filter も便利たとえば、Pandasライブラリの DataFrame の map や apply メソッドでは、ラムダ式が圧倒的に使われます。データ分析の世界では「ラムダ式が読めること」がスタートラインになるんです📊
ラムダ式は、頭で理解するよりも「実際に書いて動かす」ことで身につく分野。良書と快適な作業環境を揃えて、Pythonの「短くてカッコいい書き方」を自分のものにしていきましょう。
関数・リスト内包表記・ラムダ式といった基礎を、図解とサンプルで丁寧に解説。本稿の内容を体系的に補強したい方の最初の一冊にぴったりです。
「複雑な式の代わりにヘルパー関数を書け」「内包表記とジェネレータ式を使い分けよ」など、ラムダ式と関連するベストプラクティスを90項目で網羅。プロが書くPythonコードに近づけます。
PandasのDataFrameに対する apply や map など、ラムダ式が大活躍する分野の決定版。本稿のラムダ式を「実戦投入」できるレベルまで引き上げてくれます。
静かでスムーズな打鍵感とバックライトで、長時間のコーディングも快適。lambda や map、filter といったキーワードを何度も打ち込む学習スタイルとの相性が抜群です。
左にエディタ、右にREPLや公式ドキュメントを並べておくと、ラムダ式の挙動を確認しながら学べます。USB-C一本で接続できるモデルなら、ノートPC学習者でもデスク周りがスッキリ整います。
基本は def、その場限りで使う小さな処理は lambda、と覚えておけばOKです。「lambda を変数に代入しているくらいなら最初から def で書いた方がいい」というのがPython公式の考え方です。
三項演算子(x if 条件 else y)は使えますが、複数行にわたる処理は書けません。複雑なロジックが必要なら、迷わず def で関数を作りましょう。
多くの場合、リスト内包表記の方が高速かつ読みやすいとされています。ただし、関数を引数として受け取るAPI(sorted の key や Pandas の apply など)に渡すときは lambda が必須です。
はい、大活躍します。たとえば sorted(users, key=lambda u: u["age"]) のように key 引数にラムダ式を渡すと、辞書のリストを年齢順に並び替えるといった処理が一行で書けます。
本当です。Pandasの DataFrame.apply() や Series.map() では、ラムダ式が日常的に登場します。データ分析・機械学習の現場では、ラムダ式を読めるかどうかでコードの理解スピードが大きく変わります。
ラムダ式は、Pythonに「名前のない、その場限りの小さな関数」という強力な道具を授けてくれます。lambda 引数: 処理 というシンプルな構文を覚えるだけで、map や filter、sorted、Pandasの apply など、関数を引数として受け取るあらゆるAPIを自在に操れるようになります🚀
大切なのは「なんでもラムダ式で書く」ことではなく、「ここはラムダ式、ここは def、ここはリスト内包表記」と適材適所で選べるようになること。そうなれば、あなたのコードはぐっと短く、読みやすく、そして「読み手に伝わる」ものになっていきます。
お気に入りの書籍と快適な作業環境を揃えて、今日から lambda をあなたのコーディング道具箱に加えてみてください。書けるコードの幅が一気に広がる、その手応えを楽しみながら学習を続けていきましょう✨