活用法も!Python の lambda (ラムダ式、無名関数)について解説!

こんにちは、機械学習の講師をしている木下です!
今まで Python を使ったコーディングをしている際に、以下のような記載を見たことがありませんか?

lambda i: i + 1

この lambda という謎の文字は一体何なのか、どのようなことを意味するのか悩んでしまった方も多いと思います。
ここでは、そんな lambda (ラムダ式、無名関数)について初学者向けに解説していきます。

注意
本記事では理解を促進するため、一部非推奨な書き方を含みます。

実行環境

そもそもいつ使うのか?

lambda は単体で使うのではなく他の関数と組み合わせて使うことを前提とした関数の定義文です。普段 def を使って定義している関数をより簡潔に記述することができます!

def による関数の定義は以下の記事を御覧ください。

以下のような関数・メソッドと共に用いることが多いので、これらを見かけたら活用を考えてみてください。

  • sort (sorted)
  • max (min)
  • map
  • filter
  • optuna などの最適化ライブラリ

ただし、慣れないうちは非常に難しく感じる書き方なので、ここで一緒に押さえて活用できるようにしていきましょう!

lambda はリストの内包表記と共通した部分がありますので、そちらもぜひご覧ください。

lambda の書き方と簡単な書き換え方法

ここで、以下のような def による関数の記述を lambda で書き換える方法を見ていきましょう。

def による関数の記述
def 関数名(引数1, 引数2, …):
a = 引数を用いた処理
return a

このような一般的な関数の定義は、lambda を用いると以下のように一行で書き換えることができます

lambda による関数の記述
lambda 引数1, 引数2, …: 引数を用いた処理

実は return する変数を計算している式を : の後ろに持ってくるだけです!

lambda を使った書き換えの具体例

ここでは 実際に lambda を使って関数を書き換えてみましょう。
サンプルコードは以下の通りです。

def による関数の宣言
def add_def(a):
    a = a + 1
    return a
lambda による関数の宣言
# lambda を変数に代入することは推奨されていません
add_lambda = lambda a: a + 1 
出力結果
# 実行すると 4 が返ってきます
print(f'def: {add_def(3)}')
print(f'lambda: {add_lambda(3)}')

慣れないうちは以下の手順で書いてみると簡単にかけるようになります。

  1. def を使って関数を書いてみる
  2. return する変数を一行で表現する
  3. lambda の : の右側にその一行をもってくる

lambda の活用

先に述べたように lambda は決められた組み合わせで活用されます。例えば次のような sorted 文で用いる理由を考えてみましょう。

sorted 文における活用

sorted 文によるコード
l = ['baseball', 'soccer', 'tennis', 'kickboxing']
l_sorted_first = sorted(l)
print(l_sorted_first)
実行結果
['baseball', 'kickboxing', 'soccer', 'tennis']

このように sorted は文字列などをアルファベット順に並び替えることに用います。それでは、なぜ lambda による記述が必要なのでしょうか

例えば、1 文字目のアルファベット順ではなく、2 文字目のアルファベット順に並び替えたいといった特殊な処理のときに lambda が活きてくるんです!

以下のコードを御覧ください。

lambda を用いた sorted 文
l = ['baseball', 'soccer', 'tennis', 'kickboxing']
# 2 文字目についてアルファベット順に並び替え
l_sorted_second = sorted(l, key=lambda x:x[1])
print(l_sorted_second)
実行結果
# 実行結果
['baseball', 'tennis', 'kickboxing', 'soccer']

複雑に見えますが、ある単語の 2 文字目だけを取り出すための関数が lambda x:x[1] です。この関数を key という引数に取ることで、この関数の返り値に応じた値で並び替えを行うことができます。

このように、少し複雑な処理を関数やメソッドを用いて実行したい場合に lambda が真価を発揮することがあります

その他の活用例

filter() と lambda の組み合わせ

既存のリストから特定の条件に一致する要素だけを抽出したい場合、filter()関数とlambda関数を組み合わせて使うことができます。

filter() と lambda の組み合わせ
numbers = [1, 2, 3, 4, 5, 6]
odd_numbers = list(filter(lambda x: x % 2 != 0, numbers))
print(odd_numbers)
実行結果
[1, 3, 5]

この例ではlambda関数は数値が奇数であるかどうかを判定し、奇数だけを新しいリストに抽出します。

map() と lambda の組み合わせ

全ての要素に何らかの操作を適用して新しいリストを作りたい場合、map()関数とlambda関数を組み合わせて使うことができます。

map() と lambda の組み合わせ
numbers = [1, 2, 3, 4, 5]
squared_numbers = list(map(lambda x: x ** 2, numbers))
print(squared_numbers)
実行結果
[1, 4, 9, 16, 25]

この例では、lambda関数は数値を二乗する操作を行い、それを全ての要素に適用して新しいリストを作ります。

最後に

本記事では、Python の文法である lambda を用いた記述を解説しました。
やはり、非常に難しく感じますが、意外と見かけることが多い表現なので、ぜひこの記事を読んで理解を深めてください。

以下、まとめになります。

  • lambda は def による関数の定義を一行にまとめることができる構文
  • 基本的には他の関数・メソッドなどと組み合わせて用いる
  • def の代わりにそのまま使うことは推奨されていない

もし忘れてしまったら本記事を思い出して再度復習してみてください。

以上、Python 学習している方々のお力添えになれば幸いです!

こちらの記事もオススメ

まずは無料で学びたい方・最速で学びたい方へ

まずは無料で学びたい方: Python&機械学習入門コースがおすすめ

Python&機械学習入門コース

AI・機械学習を学び始めるならまずはここから!経産省の Web サイトでも紹介されているわかりやすいと評判の Python&機械学習入門コースが無料で受けられます!
さらにステップアップした脱ブラックボックスコースや、IT パスポートをはじめとした資格取得を目指すコースもなんと無料です!

無料で学ぶ

最速で学びたい方:キカガクの長期コースがおすすめ

一生学び放題

続々と転職・キャリアアップに成功中!受講生ファーストのサポートが人気のポイントです!

AI・機械学習・データサイエンスといえばキカガク!
非常に需要が高まっている最先端スキルを「今のうちに」習得しませんか?

無料説明会を週 2 開催しています。毎月受講生の定員がございますので確認はお早めに!

説明会ではこんなことをお話します!
  • 国も企業も育成に力を入れている先端 IT 人材とは
  • キカガクの研修実績
  • 長期コースでの学び方、できるようになること
  • 料金・給付金について
  • 質疑応答

参考リンク

参考 Python 3.9.2 ドキュメント

参考 Chainer チュートリアル