Lesson 15 ラムダ式 ― Python言語の文法(応用編)機械学習&ディープラーニング入門(Python編)

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

» 2019年08月26日 05時00分 公開
[一色政彦デジタルアドバンテージ]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「機械学習&ディープラーニング入門(Python編)」のインデックス

連載目次

ご注意:本記事は、@IT/Deep Insider編集部(デジタルアドバンテージ社)が「deepinsider.jp」というサイトから、内容を改変することなく、そのまま「@IT」へと転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。

 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関数を呼び出して、結果を表示するところまでを記述した。

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

sum = add_func(101, 234)

sum  # 335

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

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

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は、昇順(=小さい順)ではなく、降順(=大きい順)にするためのオプションである。

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式で定義したアルゴリズムをコールバック関数として指定するコード例

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。