(1時間4,000円の伴走型ビデオチャット指導も受付中!)
関数をシンプルに。Pythonのlambda式(無名関数)の基礎から応用まで
![]()
【Yuki】
こんにちは、Hirokiくん。今日はPythonのlambda(ラムダ)式について、一緒にお勉強しましょうか。
プログラミングをしていると、ほんの少しの処理のためだけに関数を定義するのが、少し手間に感じてしまうこともあるかもしれません。そんな時に役立つのが、このlambda式なんです。
誰かの役に立つために作られた、小さくて健気な道具のような……そんなイメージを持つと、少し親しみやすくなるかもしれませんね。
![]()
【Hiroki】
Yukiさん、こんにちは!よろしくお願いします。
lambda式、よくオープンソースのコードとかで見かけるんですけど、なんだか書き方が独特で……。
「わざわざ名前を付けなくてもいい関数」っていうのは聞いたことがあるんですが、具体的にどう使えばいいのか、普通の関数と何が違うのか、詳しく知りたいです。
![]()
【Yuki】
そうですよね、最初は少し戸惑うかもしれません。
でも大丈夫ですよ、仕組みはとってもシンプルですから。
まずは、lambda式の基本的な書き方から見ていきましょう。
普段、Hirokiくんが使っている def を使った関数の定義と、lambda式の書き方を比較してみますね。
lambda式の基本構文
![]()
【Yuki】
たとえば、受け取った数字を2倍にして返すだけの、とってもシンプルな関数を考えてみてください。
まずは、いつも通りの def を使った書き方です。
def double(x):
return x * 2
print(double(5)) # 結果: 10
![]()
【Hiroki】
はい、これはよく分かります。double という名前の関数を定義して、引数 x を受け取って x * 2 を返しているんですよね。
![]()
【Yuki】
ええ、その通りです。
これを、lambda式を使って書くと、次のようになるんです……。
double_lambda = lambda x: x * 2
print(double_lambda(5)) # 結果: 10
![]()
【Hiroki】
わあ、すごく短くなりましたね!
lambda x: x * 2 の部分が関数そのもの、っていうことですか?
![]()
【Yuki】
はい。lambda式の基本的な構文は、lambda 引数: 式 という形になります。
def のように名前を付ける必要がなく、一行でサッと書けてしまうのが特徴なんです。
あ、ちなみに、lambda式には return を書く必要はありません。「式」の評価結果が、そのまま戻り値(返り値)になるからなんです。
![]()
【Hiroki】
なるほど。わざわざ return って書かなくても、コロンの後の計算結果を返してくれるんですね。
でも、Yukiさん。これなら def で書いてもそんなに手間は変わらないような気がするんですけど……。
![]()
【Yuki】
ふふ、そう思うのも無理はありません。
実は、lambda式が本当に輝くのは、「他の関数の引数に関数を渡したい時」なんです。
例えば、リストの中身を並び替えたり、特定の条件で絞り込んだりする時ですね。
リストのソートでlambda式を活用する
![]()
【Yuki】
具体的に、リストの並び替え(ソート)で使われる例を見てみましょうか。
例えば、果物の名前と値段が入った「タプルのリスト」があるとしますね。
fruits = [("apple", 150), ("banana", 100), ("cherry", 300)]
これを、値段の安い順に並び替えたい時、Pythonの sorted() 関数を使いますが、そのままでは名前の順でソートされてしまうかもしれません。
ここで、lambda式の出番なんです。
![]()
【Hiroki】
あ、sorted 関数の key 引数に使うやつですね!
![]()
【Yuki】
物知りですね、Hirokiくん。その通りです。
key 引数にlambda式を渡すことで、「どの要素を基準に並び替えるか」を指定できるんですよ。
# 値段(タプルの2番目の要素、インデックス1)を基準にソート
sorted_fruits = sorted(fruits, key=lambda x: x[1])
print(sorted_fruits)
# 出力: [('banana', 100), ('apple', 150), ('cherry', 300)]
![]()
【Hiroki】
おお……! lambda x: x[1] と書くだけで、「タプルの1番目の要素(値段)を見てね」って指示できるんですね。
これなら、わざわざそのためだけに def get_price(x): return x[1] みたいな関数を作らなくて済むから、コードがスッキリします。
![]()
【Yuki】
そうなんです。
たった一度、その場所でしか使わないような小さな処理のために名前を付けるのは、少し大げさな気がしてしまいますよね。
名前がないからこそ、「この処理はこの場限りのものです」という意思表示にもなるのだと思います……。
map関数やfilter関数との組み合わせ
![]()
【Yuki】
他にも、lambda式がよく使われる場面として、map() や filter() といった関数があります。
これらは「高階関数」と呼ばれていて、関数を引数に取る関数なんですよ。
まずは、リストのすべての要素に同じ処理を適用する map() から見てみましょうか。
![]()
【Hiroki】
お願いします!
![]()
【Yuki】
例えば、数字のリストがあって、そのすべての要素を2乗した新しいリストを作りたいとします。
numbers = [1, 2, 3, 4, 5]
# すべての要素を2乗する
squared_numbers = list(map(lambda x: x**2, numbers))
print(squared_numbers) # 出力: [1, 4, 9, 16, 25]
![]()
【Hiroki】
なるほど。map(関数, リスト) の「関数」の部分に、直接lambda式を書き込めるんですね。
リストの内包表記でも似たようなことができますけど、map とlambdaの組み合わせも読みやすいです。
![]()
【Yuki】
そうですね。どちらを使うかは好みが分かれるところですが、関数型プログラミングのようなスタイルで書きたい時は、こちらの方が自然かもしれません。
次は、条件に合う要素だけを取り出す filter() です。
numbers = [1, 2, 3, 4, 5, 6]
# 偶数だけを取り出す
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # 出力: [2, 4, 6]
![]()
【Hiroki】
lambda x: x % 2 == 0 が True になるものだけを残す、っていう意味ですね。
すごく直感的です!
lambda式の中で条件分岐を使う
![]()
【Hiroki】
Yukiさん、lambda式の中で if 文を使いたい時はどうすればいいんですか?
「もし〜ならA、そうでなければB」みたいな処理を一行で書きたい時もあると思うんですけど。
![]()
【Yuki】
良い質問ですね。
lambda式の中では、通常の if 文は使えませんが、「条件演算子(三項演算子)」を使えば、条件分岐を含めることができますよ。
書き方は、値1 if 条件 else 値2 という形になります。
# 80点以上なら "Pass"、そうでなければ "Fail"
check_score = lambda s: "Pass" if s >= 80 else "Fail"
print(check_score(85)) # 結果: Pass
print(check_score(70)) # 結果: Fail
![]()
【Hiroki】
あ、これなら一行に収まりますね。
でも……あまり複雑な条件にすると、かえって読みづらくなってしまいそうな気がします。
![]()
【Yuki】
ええ、まさにその通りだと思います……。
lambda式はあくまで「シンプルに書くための道具」ですから、あまりに長くなったり、読みづらくなったりするようであれば、素直に def を使って関数を定義する方が、自分にとっても周りの人にとっても優しいコードになるはずですよ。
複雑なコードは、せっかくの小さな道具が重荷になってしまうかもしれませんから。
defとlambdaの決定的な違い
![]()
【Hiroki】
ここまでの話を聞いていると、lambda式は「短く書ける便利な関数」というイメージなんですけど、def と決定的に違う点って、名前の有無以外にあるんでしょうか?
![]()
【Yuki】
そうですね、いくつか大切なポイントがあります。
一番大きな違いは、「lambda式は『式』であり、def は『文』である」という点でしょうか。
![]()
【Hiroki】
「式」と「文」……。プログラミングの基礎で出てくる言葉ですね。
![]()
【Yuki】
はい。「式」は、評価された結果として値を返すものを指します。
だから、lambda式は関数の引数の中に直接書いたり、変数に代入したりすることができるんです。
一方で、def は「関数を定義する」という命令、つまり「文」なので、そのまま他の関数の引数に書き込むことはできません。
それから、他にも制限があります……。
- lambda式は一行しか書けません。
- return や yield といったキーワードは使えません。
- 変数の代入(x = 10 など)も行えません。
![]()
【Hiroki】
なるほど。あくまで「何かを計算して、その結果を返す」という単一の処理に特化している、ということなんですね。
![]()
【Yuki】
その通りです。
まさに、誰かのために特化した「小さな専用ツール」のような存在なんです。
Pythonの設計思想をまとめた「The Zen of Python」というものがあるのですが、そこには「Simple is better than complex(複雑であるよりは、シンプルである方がいい)」という言葉があります。
lambda式はその精神を体現している一つだと言えるかもしれませんね。
lambda式を使う際の注意点(PEP 8)
![]()
【Hiroki】
すごく便利だということは分かったんですけど、何でもかんでもlambda式で書けばいい、というわけでもないんですよね?
![]()
【Yuki】
はい。実は、Pythonの公式なコーディング規約である PEP 8 では、少し注意が促されているんです。
例えば、先ほど私が書いたような、lambda式を変数に代入して名前を付ける書き方は、あまり推奨されていません。
# 推奨されない書き方
add = lambda x, y: x + y
# 推奨される書き方
def add(x, y):
return x + y
![]()
【Hiroki】
えっ、そうなんですか!?
さっきの double_lambda = lambda x: x * 2 みたいな書き方は、あまり良くないということでしょうか。
![]()
【Yuki】
そうなんです……ちょっと恥ずかしいのですが、説明のために代入する形を使ってしまいました。
なぜ推奨されないかというと、名前を付けて再利用するなら、def で定義したほうがエラーメッセージ(トレースバック)を見た時に、関数の名前がしっかり表示されてデバッグしやすいからなんです。
lambda式はあくまで「無名」であることが本質なので、「名前を付けるなら def を使おう」というのがPythonの考え方なんですよ。
![]()
【Hiroki】
なるほど。「その場限り」だからこそ意味があるんですね。
デバッグのしやすさまで考えるのが、プロの視点なんだなぁ……。
lambda式の実践的なテクニック
![]()
【Yuki】
では、もう少し実践的な使い方も見てみましょうか。
例えば、辞書(dict)が要素になっているリストをソートする場合です。
Webアプリケーションの開発などで、データベースから取得したデータを整理する時によく使います。
users = [
{"name": "Hiroki", "age": 17},
{"name": "Yuki", "age": 22},
{"name": "Mei", "age": 25}
]
# 年齢(age)の降順(大きい順)でソート
sorted_users = sorted(users, key=lambda x: x["age"], reverse=True)
print(sorted_users)
![]()
【Hiroki】
お、辞書のキーを指定してソートするんですね。
これも実務でめちゃくちゃ使いそうです!
![]()
【Yuki】
そうですね。特定のキーの値を取り出して比較する……という処理は、まさにlambda式の得意分野です。
それから、引数を複数取ることもできます。
# 二つの引数を取って足し算をする
f = lambda x, y: x + y
print(f(10, 20)) # 結果: 30
![]()
【Hiroki】
引数が二つ以上になっても、カンマで区切るだけなんですね。
![]()
【Yuki】
はい、基本的には def の引数リストと同じように扱えます。
ただ、何度も言うようですが、引数が増えて処理が複雑になるなら、def を検討してくださいね。
読みやすさは、コードの美しさ、そして保守のしやすさに直結しますから。
まとめ
![]()
【Hiroki】
今日はありがとうございました、Yukiさん!
lambda式について、すごく整理できました。
lambda 引数: 式の形で書く無名関数。- 名前を付ける必要がない、一度きりの処理に便利。
sortedのkey指定や、map,filterと相性がいい。- 複雑なことはせず、シンプルさを保つのがコツ。
- 基本的に変数へ代入せず、その場限りの使い捨てにするのが推奨される。
こんな感じでしょうか?
![]()
【Yuki】
完璧です、Hirokiくん。飲み込みが早くて、わたしも嬉しいです。
プログラミングの世界には、lambda式のように、一見すると難しそうに見えても、実は「作業を楽にするために生まれた優しい道具」がたくさんあります。
それらを一つひとつ味方につけていけば、もっと楽しくコードが書けるようになると思いますよ。
![]()
【Hiroki】
はい!これからも頑張ります。
また分からないことがあったら、教えてくださいね。
![]()
【Yuki】
ええ、もちろんです。
わたしも、Hirokiくんが成長していく姿を見ていると、自分のプログラムがアップデートされる時のような、少しむず痒くて、でも嬉しい気持ちになります……。
またいつでも声をかけてくださいね。
参考文献
この記事では基礎を解説しましたが、実務においては「もっと複雑なデータを扱いたい」「独自のシステムに組み込みたい」といった、個別の課題に直面することも多いはずです。
「自分で書く時間は最小限に抑え、プロの品質でツールを完成させたい」という方は、ぜひ一度ご相談ください。
- 専門家の知見に基づいた、保守性の高いコード設計
- AIの専門家による、Gemini API等の最新AIを組み合わせた高度な自動化
- ChatGPT等が生成したコードのデバッグ・最適化
「教わる」だけでなく「形にする」パートナーとして、フリーランスエンジニアのmei_13が最短ルートでの解決をサポートします。
初心者から始められるPythonレッスン
● 月額4,000円で質問し放題!!
● 完全オンライン
● 翌日までには必ず返信
● 挫折しない独自の学習メソッド
● 圧倒的高評価!!
● テキストベースで時間を選ばない
● 4,000円/60分の伴走型ビデオチャット指導も可能
● 高品質なサンプルコード
詳細はこちら

