基本情報ではじめる Python (6) ラムダ式 って何? どんな用途で使うの?


2021-09-21 更新

error

この記事は基本情報技術者試験の旧制度( 2022 年以前)の記事です。
この記事の題材となっている「午後問題」は現在の試験制度では出題されません。 ご注意くださいませ。

この連載では、プログラミングの入門者を対象として、基本情報技術者試験の出題範囲にテーマを絞って、 Python の言語構文とプログラムの読み方を説明します。

今回のテーマは、ラムダ式です。かなり高度なテーマですが、試験の出題範囲を示したシラバスにあるものなので、しっかりとマスターしておきましょう。


  • (7)関数の定義

    利用者の定義による関数を用いて構造化されたプログラムを作成する。

    修得項目

    def 文,return 文,ジェネレータ,yield 文,ラムダ式,再帰呼出し,デコレータなど

出典基本情報技術者試験シラバス Ver.7.1 より

ラムダ式とは?

ラムダ式は、ラムダ計算をベースにしています。ラムダ計算は、コンピュータの動作を関数で抽象化するものであり、関数を λ(ラムダ) という文字を使って表すことから、その名前が付けられました。ラムダ計算には、様々なトピックがありますが、 Python のラムダ式は、それらの中の一部分だけを使っています。

あらかじめ結論を言ってしまうと、 Python のラムダ式は、無名関数です。

 

無名関数は、名前のない関数です。 Python では、関数を定義するときに、一般的に def 文を使いますが、もう 1 つ別の方法としてラムダ式があるのです。ラムダ式によって無名関数が作られるのです。

例を示しましょう。
以下は、
底辺 × 高さ ÷ 2
という計算で、三角形の面積を求める関数を def 文で定義したものです。

info編集部注: スマートフォンでご覧の際は、プログラムは横スクロールすると全文をご覧になれます

def triangle_area(bottom, height):
    return bottom * height / 2

この関数には、
triangle_area という名前があり、
bottom (底辺)と height (高さ)という引数があり、
bottom * height / 2 という計算式があり、
return 文で 計算結果を戻り値として返します。

 

同じ機能の関数をラムダ式で作ると、以下のようになります。ラムダ式は、

lambda 引数 : 計算式

という構文で記述します。

lambda bottom, height : bottom * height / 2

先頭の lambda というキーワードが、ラムダ式をあることを示しています。

引数が複数ある場合は、カンマで区切ります。引数が計算式で使われ、その計算結果が戻り値として返されます( return 文は、使いません)。

ラムダ式には、関数の名前に相当するものがありません。だから、無名関数なのです。

ラムダ式の呼び出し方

名前がある triangle_area 関数は、

triangle_area(10, 20)

という構文で呼び出します。

以下は、 Python の対話モードで、 triangle_area 関数を定義して呼び出した例です。説明の都合で、プログラムの行末にコメントを付けていますが、実際にプログラムを動作させるときには、これらのコメントは不要です。

infoお手元に Python の環境がない場合、ブラウザからオンラインで実行できる「 JupyterLab 」で、文中のコードをお試しください。 play_arrow ボタンを押すか「 Shift + Enter 」で実行できます

>>> def triangle_area(bottom, height):  # def文で関数を定義する
...     return bottom * height / 2
...
>>> triangle_area(10, 20)  # 関数を呼び出す
100.0

それでは、名前がないラムダ式は、どのように呼び出せばよいのでしょう? いくつかの方法があります。

1 つは、ラムダ式全体をカッコで囲んで、その後にカッコで囲んで引数を指定するという方法です。以下に例を示します。

>>> (lambda bottom, height : bottom * height / 2)(10, 20)  # ラムダ式を呼び出す
100.0

もう 1 つは、ラムダ式を変数に代入して、その変数を関数の名前として、通常の関数と同様に呼び出すという方法です。

以下に例を示します。ここでは、ラムダ式に a という名前を付けています。

>>> a = lambda bottom, height : bottom * height / 2  # ラムダ式を変数aに代入する
>>> a(10, 20)  # 変数aを関数名として通常の関数と同様に呼び出す
100.0

ラムダ式の実用的な使い方と高階関数

先ほど、ラムダ式を呼び出す方法を 2 つ示しましたが、どちらもラムダ式の実用的な使い方ではありません

Python におけるラムダ式の実用的な使い方は、高階関数( higher order function )の引数にすることです。高階関数とは、引数に関数を指定する関数のことです。

 

Python には、あらかじめ様々な高階関数が用意されています。

たとえば、 Python の組み込み関数( import 文でインポートせずに、すぐに使える関数)の filter 関数は、

filter(関数, イテラブル)

という構文の高階関数です。

filter 関数は、 2 つの目の引数で指定されたイテラブル(リストやタプルなど)から要素を順番に取り出し、それを 1 つ目の引数で指定された関数に渡して True が返されたものだけを抽出します。

 

例として、 filter 関数を使って、

[1, 2, 3, 4, 5] というリストから、 3 以上の要素だけを抽出

してみましょう。

filter 関数の 1 つ目の引数に指定する関数は、引数の値が 3 以上ならTrueを返す、という機能にします。この関数を、 def 文を使って three_or_greater という名前で定義すると、以下のようになります。

def three_or_greater(data):
    return data >= 3

filter 関数を、 1 つ目の引数に three_or_greater 関数を指定し、 2 つ目の引数に、 [1, 2, 3, 4, 5] というリストを指定して実行すると、以下のように 3 以上の[3, 4, 5] が抽出されます。

>>> def three_or_greater(data):  # def文で関数を定義する
...     return data >= 3
...
>>> list(filter(three_or_greater, [1, 2, 3, 4, 5]))  # 引数に関数を指定する
[3, 4, 5]

filter 関数は、戻り値として filter オブジェクトを返すので、ここでは、それを list 関数でリストに変換しています。リストに変換しないと、要素の値を画面に表示できないからです。

 

さて、ここからがポイントです。

filter 関数の 1 つ目の引数に指定しているのは、引数の値が 3 以上なら True を返す、という単純な機能の関数です。 filter 関数を使うために、わざわざ three_or_greater 関数という定義するのは面倒でしょう。

もしも、

filter(>= 3, [1, 2, 3, 4, 5])

のように、 filte r関数の引数に >= 3 という条件が指定できたら便利です。

ただし、 Python の構文では、関数の引数に条件だけを指定することができません。どうしましょう? そうです! こういう場面で、ラムダ式が役立つのです。

 

filter 関数の引数に、 >= 3 という条件は指定できませんが、

lambda data : data >= 3

というラムダ式なら指定できます。これが、ラムダ式の実用的な使い方です。以下に、例を示します。

>>> list(filter(lambda data : data >= 3, [1, 2, 3, 4, 5]))  # 引数にラムダ式を指定する
[3, 4, 5]

いかがでしたか。 Python のラムダ式の意味と使い方を、しっかりとマスターできたでしょう。

この連載では、今後も、基本情報技術者試験を Python で受けるための知識を取り上げて行きます。

それでは、またお会いしましょう!

 

label 関連タグ
科目A試験は、
免除できます。
独習ゼミで科目A試験を1年間免除して、科目B試験だけに集中しましょう。
免除試験を受けた 74.9% の方が、
科目A免除資格を得ています。
科目A免除試験 最大 2 回の
受験チャンス !
info_outline
科目A免除試験 最大 2 回の
受験チャンス !
詳しく見てみるplay_circle_filled
label これまでの『基本情報ではじめるPython』の連載一覧 label 著者