lambdaとは
lambdaは、短い処理をその場でさっと書くための関数です。defを使った関数とは少し役割が異なります。このセクションでは、lambdaがどんなものなのか、defとの違いや書き方のルールを順番に見ていきましょう。
【関連】Pythonをもっと詳しく学ぶならpaizaラーニング
lambdaの基本
lambdaは「短い処理を一時的に使いたい」ときに便利な書き方です。
Pythonで関数を定義する際、通常であればdefキーワードを使い、名前をつけます。一方、lambdaは名前をつけずにその場で処理を書けるため、「無名関数」とも呼ばれます。
例えば「数値を2倍にする」という処理を1回だけ使いたいだけなのに、わざわざdefで関数に名前をつけるのは、少し大げさに感じる場合もあるでしょう。そんな場面でlambdaが役立ちます。
ただし、lambdaで書けるのは1つの式だけです。
複雑な処理や複数の手順が必要なロジックには向いていないため、あくまで「短くて使い捨ての処理」に使うものと考えておくとよいでしょう。
次のコードは、数値を2倍にするlambdaの例です。
非常にシンプルな形であることがわかるのではないでしょうか。
lambdaの書き方については、後ほど説明します。ここでは、シンプルな形になるという点だけイメージできれば十分です。
出力結果
10defで作る関数との違い
defとlambdaは、どちらも処理をまとめておく仕組みですが、向いている使い方が違います。
defは名前をつけて定義するので、プログラムのあちこちから何度でも呼び出せます。
条件分岐や繰り返しを含むような、複雑な処理にも対応できます。
一方のlambdaは名前をつけず、1つの式だけで処理を表します。1回限りで使い切るような、シンプルな処理にぴったりです。
迷ったときは、「何度も使う」場合や「複雑になりそう」ならdef、「その場で1回だけ使う短い処理」ならlambdaと考えると判断しやすくなります。
比較項目 |
def |
lambda |
|---|---|---|
名前 |
つける |
つけない(無名) |
処理の長さ |
何行でも可 |
1つの式のみ |
再利用 |
しやすい |
その場限りが基本 |
可読性 |
高い |
短い処理なら高い |
lambdaでの基本構文
lambdaの書き方はとてもシンプルで、
lambda 引数: 式
という形で書きます。
引数とは関数に渡す値で、式とはその引数を使って計算や変換を行う処理です。
defで関数を書く場合と比べると、returnや関数名を書く必要がなく、1行でまとめられます。ちなみに、引数は1つだけでなく、複数指定できます。
下記のコード例では、2つの数値を足し合わせるlambdaと、同じ処理をdefで書いたものを並べています。
出力結果
7
7どちらも同じ結果になりますが、lambdaの方がreturnや関数名を書かない分、短く済んでいるのがわかりますね。
lambdaの基本的な使い方
lambdaの書き方がわかったところで、ここからは実際にどう使うかを見ていきましょう。
数値や文字列の加工、条件分岐など、よく使われる場面を1つずつ確認していきます。
数値や文字列を使った基本例
lambdaは数値の計算だけでなく、文字列の加工にも使えます。
例えば「数値を2乗する」「名前の末尾に文字を追加する」といった処理が、lambdaなら1行で書けます。受け取った値をそのまま式の中で加工して、結果として返すだけなので、短くて読みやすいコードになります。
出力結果
イヌさん
16この例では、動物の名前の末尾に「さん」をつける処理と、数値を2乗する処理をそれぞれlambdaで書いています。
どちらも「受け取った値を1つの式で加工してそのまま返す」というシンプルな形です。
ifを使った条件分岐
「条件によって処理を変えたい」とき、lambdaの中ではif文をそのまま書くことはできません。そこで使うのが、三項演算子(条件式)です。
通常のif文は複数行になりますが、lambdaは1行しか書けないため、
値A if 条件 else 値Bという形を使います。これは「条件が真なら値A、偽なら値B」を返す書き方で、Python全般で使える書き方です。
次のコード例では、動物の体重が10より大きいかどうかを判定する処理をlambdaで書いています。
出力結果
おおきい
ちいさい通常のif文では複数の行が必要になる処理を1行でまとめられるのが、この書き方の利点です。
【関連】Pythonのif文の使い方は?基本構文から応用まで初心者向けに徹底解説
複数行で書けない理由
lambdaが複数行の処理を書けないのは、設計として「1つの式だけを返す」のが前提になっているからです。
「式」とは、簡単にいうと「計算して値を返すもの」になります。if文やfor文は「文」と呼ばれ、式とは別物として扱われるのです。
lambdaには式しか書けないため、複数の処理を順番に実行したり、ループを回したりすることはできません。そういった処理が必要になったら、無理にlambdaを使わずdefで関数を定義しましょう。
出力結果
ネコはちいさいですここでは
「条件を判定する」
「文字列を組み立てて返す」
という2つの処理が行われています。
このように、処理が2つ以上ある場合はdefを使うのが自然です。
初心者が避けたい読みにくい書き方
lambdaは短く書けるのが利点ですが、どんな場合でもlambdaにすればよいわけではありません。
短く書こうとするあまり、入れ子にしたり複雑な条件をまとめたりすると、逆にコードが読みにくくなってしまいます。特に慣れないうちは、「短く書けるか」よりも「後から読んで意味がわかるか」を優先するようにしましょう。
次のコードは、処理は動きますが読みにくい例です。
出力結果
8lambdaの中にさらにlambdaが入っており、ひと目で処理の意図を読み取るのは難しいコードです。
処理の流れを確認しておきます。
- f = lambda x: (lambda y: x + y)(3) で、fには「引数xを受け取り、その場で別のlambdaを定義してすぐに呼び出す」という処理が代入される
- print(f(5)) が実行される。xに5が渡される
- 内側のlambda y: x + yが定義され、すぐに(3)で呼び出される。yに3が渡され、外側のx(5)と合わせて5 + 3 = 8が計算される
- 8が返され、print()で表示される
このような書き方は、処理の意図がすぐに伝わりません。「処理がひと目で読めるか」を基準に判断して、lambdaを使うようにしましょう。
map・filter・sortでのlambdaの使い方
lambdaは単体で使うよりも、map・filter・sortedといった組み込み関数と一緒に使われるケースが多いです。
これらの関数は「どんな処理をするか」を引数として受け取る仕組みになっており、その部分にlambdaを渡すと、短く直感的に書けます。この章では、それぞれの使い方を見ていきます。
mapとlambdaの組み合わせ
mapは、リストの各要素に同じ処理を繰り返し適用するための関数です。
forループを使っても同じ処理は書けますが、mapとlambdaを組み合わせると1行でまとめて書けます。「リストの全要素に同じ加工をしたい」という場合に向いている書き方です。
mapの結果はそのままだと扱いにくいので、list()で囲んでリストに変換します。
実際にforループとmapの書き方が、どう違うのかを見てみましょう。
出力結果
['イヌちゃん', 'ネコちゃん', 'ウサギちゃん']
['イヌちゃん', 'ネコちゃん', 'ウサギちゃん']map(関数, リスト)という形で、「リストの全要素にこの関数を適用して」と指定しています。ただし、mapの結果はそのままでは内容を確認しづらいため、list()で囲んでリストに変換しています。
どちらも同じ結果になりますが、mapとlambdaを組み合わせれば、forループと同じ処理を1行で書けることがわかりますね。
filterとlambdaの組み合わせ
filterは、リストの中から条件に合う要素だけを取り出すための関数です。
lambdaで条件式を書き、それをfilterに渡すと、条件に合う要素だけが残り、合わない要素は除外されます。mapと同じく、結果はlist()で囲んでリストに変換します。
下記は、動物の体重リストから10より大きいものだけを取り出しているコード例です。
出力結果
[('ウマ', 400), ('ゾウ', 5000)]x[1]で、タプルの2番目の要素(体重)を取り出しています。
条件式をlambdaの中に書くと、取り出したい条件をその場で簡潔に指定できます。
sort・sortedとlambdaの組み合わせ
リストを並び替えたいとき、「何を基準に並べるか」をkeyという引数で指定できます。このkeyにlambdaを渡すと、自分の決めた基準で並び替えできます。
sort()はリスト自体を書き換え、sorted()は新しいリストとして返します。どちらもkey=lambda……という形で使う点は同じです。
次の例では、動物と体重のリストを体重の小さい順に並べています。
出力結果
[('ネコ', 4), ('イヌ', 8), ('ウマ', 400), ('ゾウ', 5000)]keyにlambdaを渡すことで、「何を基準に並べるか」を自由に指定できるのがポイントです。
sorted()はデフォルトで小さい順(昇順)に並べる仕様になっているため、指定しなくても自動的に小さい順になります。
ちなみに、大きい順(降順)に並べたい場合は、
のように書きます。reverse=Trueを追加するだけです。
またx[0]に変えれば、動物名のアルファベット順で並べられます。
このように、lambdaの中身を変えるだけで、さまざまな基準に対応できます。
【関連】Pythonのsortとsortedの違いは?それぞれの特性や使い分け方を詳しく解説
list内包表記との使い分け
mapやfilterを使う処理は、list内包表記でも書ける場合があります。
list内包表記とは、次のような形でリストを作る書き方です。
Pythonではよく使われ、mapやfilterよりも読みやすいと感じる場面も多いです。どちらを使うかは「読んだときに意味が伝わりやすいか」を基準にするとよいでしょう。
次の例では、同じ処理をmapとlist内包表記で比べています。
出力結果
['イヌちゃん', 'ネコちゃん', 'ウサギちゃん']
['イヌちゃん', 'ネコちゃん', 'ウサギちゃん']シンプルな処理ならlist内包表記の方が読みやすいケースが多いため、使い分けを意識しましょう。
【関連】Pythonのlistを徹底攻略!基本から実践応用まで初心者向けに解説
lambdaの関連機能
lambdaは単独で使われるだけでなく、外部のライブラリや別の言葉と組み合わせて登場するケースがあります。また、lambdaについて調べていると、似たような名前の機能やサービスを目にするはずです。
特に「pandas」や「AWS Lambda」、「async」といったキーワードは混同されやすいため、それぞれの関係を整理しておきましょう。
pandasのapplyとlambda
データ分析ライブラリのpandasには、表の列や行に処理をまとめて適用できるapplyというメソッドがあります。
このapplyにlambdaを渡すと、各行や各列の値を変換できます。
例えば「体重の列の値をすべてkg単位に変換する」「体重の列の値をすべて2倍にする」といった処理も、シンプルに1行で書けます。
出力結果
動物 体重 体重2倍
0 イヌ 8 16
1 ネコ 4 8
2 ウサギ 2 4apply(lambda……)という形はpandasを使うコードでよく登場します。意味がわかると、データ処理のコードがぐっと読みやすくなるでしょう。
【関連】Pythonのpandasとは?導入手順や基本操作を分かりやすく解説
AWS Lambdaとの違い
「Lambda」という言葉をネットで検索すると、「AWS Lambda」というクラウドサービスが出てくるはずです。名前が似ているので混同しやすいですが、Pythonのlambdaとは全く別物です。
Pythonのlambdaは、関数を短く書くためのプログラムの文法の一部です。
一方、AWS LambdaはAmazonが提供するクラウドサービスです。サーバーを用意しなくてもコードを実行できる仕組みを持っています。
Pythonのコードをその上で動かせますが、名前が同じなだけで概念としては無関係です。
比較項目 |
Pythonのlambda |
AWS Lambda |
|---|---|---|
種類 |
プログラムの文法 |
クラウドサービス |
用途 |
無名関数の記述 |
サーバーレスでのコード実行 |
関係性 |
無関係 |
無関係 |
PythonのlambdaとAWSのLambdaは、別物だと覚えておきましょう。
async処理とlambdaの注意点
Pythonにはasyncとawaitを使った非同期処理という仕組みがあります。
非同期処理とは、時間のかかる処理を待っている間に別の処理を進められる仕組みのことです。Webからデータを取得する間も、画面を操作し続けられるのは、非同期処理のおかげです。
この非同期処理とlambdaは、同じ感覚では使えません。async defを使えば非同期の関数を定義できますが、lambdaにはasyncをつけられないのです。
つまり、非同期処理が必要な場面ではlambdaは使えないため、async defで関数を定義する必要があります。使える前提で書くと構文エラーになるため、注意が必要です。
出力結果
トリの処理が完了しました非同期処理を扱う場合は、lambdaを使わずasync defを使いましょう。
エンジニアが考えるべき使いどころ
実際にコードを書くと、「これはlambdaでいいのか、defにすべきか」と迷う場面は意外と多いと思います。
判断の基準はシンプルで、「1行で意図が伝わるか」どうかです。処理が短くてひと目で読める場合は、lambdaが向いています。
一方、処理が複数の手順に分かれていたり、チームで共有するコードだったりする場合は、名前のついたdefの方が読みやすくなります。
コードは書いた後も誰かに読まれ続けるものです。「短く書けるか」よりも「後から読んでも意図が伝わるか」という視点を持つと、lambdaとdefの使い分けが自然にできるようになるでしょう。
具体的な場面と適した書き方について、具体例をまとめてみました。参考にしてみてください。
場面 |
適した書き方 |
|---|---|
一時的な短い変換処理 |
lambda |
map・filter・sortedのkeyに渡す |
lambda |
処理が複数の手順にわたる |
def |
関数を繰り返し呼び出す |
def |
よくある質問(Q&A)
Q. lambdaで変数に代入して使ってもよいですか?
技術的には可能ですが、PEP 8(Pythonのスタイルガイド)では推奨されていません。変数に代入して繰り返し使うなら、素直にdefで関数を定義する方が読みやすくなります。lambdaはあくまで「その場で使い捨て」が基本です。
Q. lambdaの中でprint()を使えますか?
使えません。print()は値を返さない関数(戻り値がNone)で、lambdaは式の結果を返す仕組みを前提にしているためです。デバッグで中身を確認したい場合は、defで関数を定義して中にprint()を書くのが適切です。
Q. lambda内で外側の変数を使えますか?
使えます。Pythonでは関数の外側で定義された変数をその内側で参照できる仕組み(クロージャ)があり、lambdaも同様です。ただし、外側の変数が後から変わると影響を受ける場合があるため、注意しましょう。
出力結果
['イヌさん', 'ネコさん', 'トリさん']Q. lambdaは何個まで引数を受け取れますか?
個数の制限はありません。カンマで区切れば複数の引数を受け取れます。ただし引数が多くなるほど読みにくくなるため、3つ以上になるならdefの方が適しているでしょう。
Q. sorted()のkeyとlambdaを組み合わせるとき、逆順にするにはどうすればよいですか?
reverse=Trueを追加するだけです。keyで並び替えの基準を指定しつつ、reverse=Trueを渡せば降順に並び替えられます。
出力結果
[('ゾウ', 5000), ('イヌ', 8), ('ネコ', 4)]まとめ
この記事では、Pythonのlambdaについて、基本的な書き方から実際の使い方まで解説しました。
lambdaは「名前のない関数」という、初めて見ると不思議に思える仕組みのため、難しいと感じる方は多いかもしれません。しかし、その特性を理解して活用できると心強い味方になってくれます。
lambdaを活用したいのは、次のような場面です。
lambdaが活躍する場面
- map・filter・sortedのkeyなど、組み込み関数に処理を渡したいとき
- リストの加工や条件による絞り込みを、その場で短く済ませたいとき
- pandasのapplyなど、ライブラリの引数として小さな処理を渡したいとき
lambdaを書く上で、押さえておきたいポイントをまとめます。
重要なポイント
- lambdaは短い処理をその場で書ける、使い捨ての関数
- lambdaは、1行の式だけで簡潔に書ける
- 複数の処理が必要な場合は、lambdaではなくdefを使用する
- defは繰り返し使う関数に、lambdaは一時的な短い処理に向いている
- 簡潔さよりも保守性を重視するケースでは、lambdaよりdefが有用
lambdaを使えると、ちょっとした処理を関数として定義する手間が減り、コードがすっきりします。
最初はとっつきにくく感じるかもしれませんが、使える場面さえ覚えてしまえば、自然と手が動くようになります。まずは、この記事で紹介した基本構文から実際にコードを書いて試してみてください。