Pythonの匿名関数(lambda)と通常の関数の違いを比較!使い分けガイド
生徒
「Pythonでlambdaっていう書き方を見たんですけど、普通の関数と何が違うんですか?」
先生
「lambdaは匿名関数と呼ばれていて、その場で簡単に関数を作る方法なんです。通常の関数と違って名前を付けなくても使えます。」
生徒
「じゃあ、普通のdefで作る関数はいらないんですか?」
先生
「いえ、状況によって使い分けが大事です。今からlambdaと通常の関数の違いと使いどころを詳しく見ていきましょう。」
1. 匿名関数(lambda:ラムダ式)とは?
匿名関数とは、その名の通り「名前を付けずに定義できる関数」のことです。Pythonではlambda(ラムダ)というキーワードを使って記述するため、一般的に「ラムダ式」とも呼ばれます。
プログラミング初心者の方にとって、関数を作るにはdefを使って名前を決めて……という手順が当たり前に感じるかもしれません。しかし、lambdaを使えば、わざわざ名前を付けるほどでもない「ちょっとした計算」を、その場ですぐに実行できます。
基本的な書き方のルールは以下の通りです。
- lambda 引数: 処理内容(戻り値)
例えば、「受け取った数に10を足す」という非常にシンプルな処理をlambdaで書くと、以下のようになります。変数plus_tenに代入することで、後から呼び出すことも可能です。
# lambdaを使って「10を足す」関数を作成
plus_ten = lambda x: x + 10
# 実行して結果を表示
print(plus_ten(5)) # 出力: 15
このように、lambdaは「1行で完結する」「使い捨ての処理」をスマートに記述するのに非常に向いています。コードが短くなるだけでなく、直感的に何をしているかが分かりやすくなるというメリットがあります。
2. 通常の関数(def)とラムダ式の違い
Pythonで処理をまとめる際、最も一般的なのがdefキーワードを使った「通常の関数」です。これに対して、lambda(ラムダ式)は「名前を付けるまでもない、ちょっとした計算」に向いています。
通常の関数(def)の特徴
defは、いわば「再利用可能なレシピ」をしっかり保存するイメージです。処理が複数行にわたる場合や、後から何度も呼び出して使いたい場合に適しています。また、プログラミング未経験の方にとっても、どこからどこまでが関数の処理なのかが視覚的にわかりやすいのがメリットです。
# 通常の関数で「2つの数字を足す」処理を作る
def add(x, y):
return x + y
# 作った関数を呼び出す(実行する)
print(add(3, 5)) # 出力結果: 8
ラムダ式(lambda)との比較
比較すると、lambdaは1行で簡潔に結果を返せるためコードがスッキリしますが、複雑な条件分岐(もし〜なら、といった処理)や、長い計算には向きません。一方で、defは「もしAならB、そうでなければC」といった複雑なロジックを自由に盛り込むことができます。
まずは「しっかり作り込みたい時はdef」「使い捨ての簡単な計算はlambda」という使い分けから覚えていきましょう。
3. lambdaとdefの使い分けの目安
Pythonを学び始めたばかりだと、「結局どっちを使えばいいの?」と迷うかもしれません。判断基準は非常にシンプル。「その処理を何度も使い回すか」と「パッと見て内容が理解できるか」の2点です。
lambda(無名関数)が向いているケース
名前を付けて保存するほどでもない、その場限りの「ちょっとした計算」に最適です。例えば、データの並び替えや、特定の条件で値を絞り込む際によく使われます。コードが1行でスッキリ収まるのがメリットです。
def(通常の関数)が向いているケース
2行以上の複雑な処理になる場合や、他の場所でも同じ計算を行いたい場合は必ずdefを使いましょう。関数に分かりやすい「名前」を付けることで、後からプログラムを読み返したときに、何をしている場所なのか一目で理解できるようになります。
例えば、リストの中にある単語を「文字の長さ順」に並び替えたい場合、わざわざ新しい関数を定義するよりも、lambdaを使うと直感的で短いコードになります。
# 果物のリストを用意します
words = ["apple", "banana", "cherry"]
# 文字が短い順番に並び替えます(keyにlambdaを指定)
# xにはリストの各要素が入り、len(x)で文字の長さを測っています
words.sort(key=lambda x: len(x))
print(words) # 出力結果: ['apple', 'cherry', 'banana']
このように、プログラミング未経験の方でも「この1箇所だけで使うルール」を決めたいときはlambda、本格的な仕組みを作るときはdef、と覚えておくとスムーズに学習を進められますよ。
4. 実用例:mapとlambdaの組み合わせ
Pythonでリストのデータを一括で処理したいとき、map()関数とlambda(ラムダ式)を組み合わせると、コードが驚くほどスッキリします。特に「リスト内のすべての数字を2倍にする」といった単純な作業では、わざわざdefを使って関数を定義する手間が省けるため、プログラミング初心者の方にもおすすめのテクニックです。
例えば、以下のコードはリストの中にある数値をすべて2乗するサンプルです。
# 元の数値リスト
numbers = [1, 2, 3, 4, 5]
# map関数とlambdaを使って、各要素を2乗して新しいリストを作る
squared = list(map(lambda x: x ** 2, numbers))
print(squared) # 出力結果: [1, 4, 9, 16, 25]
このコードの仕組みを詳しく解説します。map(関数, リスト)は、第2引数に渡したリストの要素を、第1引数の関数へ1つずつ放り込んで処理してくれる便利な道具です。そこでlambda x: x ** 2という「使い捨ての関数」をその場でサッと記述することで、行数を減らしつつ、何を行っているかが一目でわかる直感的なプログラムを書くことができます。
「名前を付けて保存するほどではないけれど、ちょっとした計算をリスト全体に適用したい」という場面で、この書き方は非常に重宝されます。これぞPythonらしい、スマートな書き方の代表格と言えるでしょう。
5. lambda(ラムダ式)の制限と注意点
lambdaは非常に便利ですが、万能ではありません。実は、Pythonの設計思想として「シンプルであること」が重視されているため、あえていくつかの制限が設けられています。初心者が陥りやすいポイントを整理しました。
1. 処理は「1行」しか書けない
lambdaの最大の制限は、1行の式しか書けないという点です。例えば、複数の計算を行ったり、複雑な処理をステップごとに記述したりすることはできません。
2. 複雑な条件分岐や例外処理が苦手
if文を使った複雑な条件分岐や、エラーを防ぐためのtry-exceptなどは、lambdaの中には書けません。無理に詰め込もうとすると、かえってコードが読みづらくなってしまいます。
3. コードの可読性(読みやすさ)が下がる
「1行で書けるから」と何でもlambdaにしてしまうと、後でプログラムを見返したときに「何をしているのか分からない」という状態になりがちです。
「この処理、ちょっと複雑だな」と感じたら、
lambdaを使わずに通常のdefを使った関数作成に切り替えるのが、良いプログラマーへの第一歩です。
具体的な比較サンプル
例えば、20歳未満かどうかを判定する処理を考えてみましょう。無理に1行で書こうとするよりも、通常は以下のように書いたほうが誰が見ても分かりやすくなります。
# lambdaで無理に書こうとすると読みづらくなる例
# check_age = lambda age: "未成年" if age < 20 else "成人"
# 初心者におすすめの分かりやすい書き方(def関数)
def check_age(age):
if age < 20:
return "20歳未満の方はご利用できません。"
else:
return "ご自由にご利用ください。"
print(check_age(18))
このように、lambdaは「使いどころ」を見極めることが非常に重要です。
6. 通常関数を選ぶべきケース
複雑な処理や、他の場所からも何度も呼び出す予定がある処理はdefを使いましょう。
def process_numbers(numbers):
result = []
for n in numbers:
if n % 2 == 0:
result.append(n * 2)
else:
result.append(n)
return result
print(process_numbers([1, 2, 3, 4]))
[1, 4, 3, 8]
7. まとめると
lambdaは短く簡単な処理に、defは複雑で再利用する処理に向いています。両方を適材適所で使うことで、Pythonのコードはより効率的で読みやすくなります。