機械学習 & ディープラーニング入門(Python編)[Lesson 15]

機械学習 & ディープラーニング入門(Python編)[Lesson 15]

ラムダ式 ― Python言語の文法(応用編)

2019年8月26日

本連載では、コードを書く流れに沿ってPython言語の基礎文法を説明してきた。今回は、応用的だが、利用頻度が高く重要な文法として、ラムダ式を紹介する。

一色政彦 デジタルアドバンテージ 一色 政彦

 Python言語の文法のうち、応用的だが押さえておいてほしいものをいくつか、具体的には、

  • if 条件式(Lesson 14)
  • and/or/not 論理演算子(Lesson 14)
  • ラムダ式(Lesson 15)
  • リスト内包表記(Lesson 16)
  • 例外(Lesson 17)

の5項目を紹介してから終わりとしたい。これらは、Pythonのサンプルコードを読む際に出くわす可能性が特に高く、しかも知らないと非常に難解そうなコードに思えてしまうものである。そのうち今回は、「ラムダ式」について説明する。脚注や図、コードリストの番号は前回からの続き番号としている。

 なお、本稿で示すサンプルコードの実行環境については、Lesson 1を一読してほしい。

 Lesson 1でも示したように、本連載のすべてのサンプルコードは、下記のリンク先で実行もしくは参照できる。

Google Colabで実行する
GitHubでソースコードを見る

Python言語の文法(応用編)

ラムダ式

 ラムダ式lambda expression)とは、関数をその場で短く書く方法である。例で示そう。

 例えば、arg_xarg_yという2つの引数を取り、それを足し算するadd_func関数を定義するとしよう。これをdef文で記述すると次のようになる。リスト20-1では、add_func関数を呼び出して、結果を表示するところまでを記述した。

Python
def add_func(arg_x, arg_y):
  return arg_x + arg_y

sum = add_func(101, 234)

sum  # 335
リスト20-1 def文により関数を定義するコード例

 これをラムダ式で書くと、リスト20-2のようになる。

Python
add_lambda = lambda arg_x, arg_y: arg_x + arg_y

sum = add_lambda(101, 234)

sum  # 335
リスト20-2 lambda式により関数を定義するコード例

 ラムダ式は図19のような構文になっている。関数の中身には式を1つだけ書ける。このため、ラムダ式で定義できるのはシンプルな処理を行う関数だけとなる。

ラムダ式の構文
図19 ラムダ式の構文

 文(形式の関数)が式(形式のラムダ式)になっているわけであるが、この例だけだと「なぜラムダ式が良いのか」は分からないだろう。ラムダ式が役立つのは、

ある関数some_actionが、その関数内部の処理を実行中に、別の関数callbackを呼び出す、

ような場合だ。

 呼び出される別の関数callbackコールバック関数と呼ばれる。その実体は、ある関数some_actionの引数に指定された「関数オブジェクト」(=def文で定義した関数の名前もしくはlambda式)である。例えば、ソート(=順番の並べ替え)で独自の並べ替え方法(=ソート方法)を実装する場合には、その独自アルゴリズムを「通常の関数」として記述して、その名前を、対象の関数の引数に指定する。もしくは、対象の関数の引数に対して「ラムダ式」で独自アルゴリズムを直接記述することになる。

 コールバック関数として、もちろん通常の関数を指定しても問題ない。ただしソートの場合は、比較的シンプルなアルゴリズムのコードになることが多いので、ラムダ式で指定した方が、コードを見たときのソートの意味が分かりやすい、というメリットが出てくる。

 ……といった言葉の説明では「分からない」と感じた人も多いと思うので、具体的なコードを見てみよう。ここでは、別連載『機械学習 & ディープラーニング入門(データ構造編)』の「[Lesson 1] 機械学習を始めるための、Pythonデータ構造「多次元リスト」入門 - Deep Insider」のリスト2-2で示した身長の1次元リスト値を、10で割ったときの余りの大きさ順でソートする独自アルゴリズムを構築するとしよう。

 リスト20-3は、Python言語に標準で用意されている(=つまり組み込み関数の)sorted()関数を呼び出してソートしているところだ。引数keyに指定しているのがコールバック関数で、ここに独自のソートアルゴリズムを「ラムダ式」で指定している。なお、引数reverseは、昇順(=小さい順)ではなく、降順(=大きい順)にするためのオプションである。

Python
heights = [ 165.5, 177.2, 183.2 ]

sorted_heights = sorted(heights, key=lambda x: x % 10, reverse=True)

sorted_heights  # [177.2, 165.5, 183.2]
リスト20-3 lambda式で定義したアルゴリズムをコールバック関数として指定するコード例

 結果を見ると、1の位以下が「7.2」「5.5」「3.2」という順に並んでおり、「10で割ったときの余りの大きさ順」でソートされた結果になったことが分かる。

 引数keyの値はlambda x: x % 10という非常に短いコードになっている点に注目してほしい。これを「通常の関数」によるコールバック関数にすると、リスト20-4のようになる。

Python
def sort_algo(arg_x):
  return arg_x % 10

sorted_heights = sorted(heights, key=sort_algo, reverse=True)

sorted_heights  # [177.2, 165.5, 183.2]
リスト20-4 def文で定義したアルゴリズムをコールバック関数として指定するコード例

 リスト20-4とリスト20-3のどちらが良いかは個人的な好みもあると思うが、一般的にはリスト20-3のようにラムダ式でシンプルに書く方が好まれており、実際に機械学習やディープラーニングでも多用されている。

つづく

 今回は、ラムダ式について説明した。次回は、リスト内包表記について紹介する。

  • このエントリーをはてなブックマークに追加

※以下では、本稿の前後を合わせて5回分(第13回~第17回)のみ表示しています。
連載の全タイトルを参照するには、[この記事の連載目次]を参照してください。

機械学習 & ディープラーニング入門(Python編)[Lesson 15]
13. 旧バージョン2環境への対応、標準ライブラリ ― Python言語の文法(応用編)

Python言語の文法を、コードを書く流れに沿って説明してきた本連載。今回からは、応用的なトピックを取り上げていく。今回は、Python 3文法で書いたコードをPython 2系環境で実行する方法とPython標準ライブラリについて説明する。

2019年8月24日(土)
機械学習 & ディープラーニング入門(Python編)[Lesson 15]
14. if 条件式、and/or/not 論理演算子 ― Python言語の文法(応用編)

本連載では、コードを書く流れに沿ってPython言語の基礎文法を説明してきた。今回は、応用的だが、利用頻度が高く重要な文法として、if条件式とand/or/not論理演算子を紹介する。

2019年8月25日(日)
機械学習 & ディープラーニング入門(Python編)[Lesson 15]
15. 【現在、表示中】≫ ラムダ式 ― Python言語の文法(応用編)

本連載では、コードを書く流れに沿ってPython言語の基礎文法を説明してきた。今回は、応用的だが、利用頻度が高く重要な文法として、ラムダ式を紹介する。

2019年8月26日(月)
機械学習 & ディープラーニング入門(Python編)[Lesson 15]
16. リスト内包表記 ― Python言語の文法(応用編)

本連載では、コードを書く流れに沿ってPython言語の基礎文法を説明してきた。今回は、応用的だが、利用頻度が高く重要な文法として、リスト内包表記を紹介する。

2019年8月28日(水)
機械学習 & ディープラーニング入門(Python編)[Lesson 15]
17. 例外 ― Python言語の文法(応用編)

本連載では、コードを書く流れに沿ってPython言語の基礎文法を説明してきた。今回は、応用的だが、利用頻度が高く重要な文法として、例外を紹介する。

2019年8月30日(金)
Deep Insider の SNS :

本コンテンツの目次

機械学習 & ディープラーニング入門(Python編)[Lesson 15]
機械学習 & ディープラーニング入門(Python編)[Lesson 15]

ラムダ式 ― Python言語の文法(応用編)


本コンテンツに関連する重要用語