Pythonのラムダ関数

ラムダ関数とは?

Pythonでは、無名関数を宣言する際に lambda キーワードを使用します。無名関数とは、名前を付けずに宣言された関数のことを指します。構文的には異なるように見えますが、ラムダ関数は def キーワードを使って宣言された通常の関数と同じように振る舞います。Pythonのラムダ関数の特徴は次のとおりです。

  • ラムダ関数は任意の数の引数を取ることができますが、1つの式しか含まれません。ラムダ関数は引数をいくつでも取ることができますが、式は1つだけです。式はラムダ関数が実行するコードの一部であり、値を返すかどうかは問いません。
  • ラムダ関数は、関数オブジェクトを返すために使用することができます。
  • ラムダ関数は関数オブジェクトを返すことができます。

今回は、Pythonのラムダ関数について詳しく説明し、その使用例も紹介します。

ラムダ関数の作成

ラムダ関数を宣言するには、次の構文を使用します。

lambda argument(s): expression


上記のように、引数はいくつでも指定できますが、式は1つだけです。また、ラムダ演算子は、任意の変数に代入可能な関数オブジェクトを返します。

例えば

remainder = lambda num: num % 2


print(remainder(5))


出力

1


このコードでは、lambda num: num % 2 がラムダ関数にあたります。numが引数で、num % 2` が評価される式で、式の結果が返されます。この式は、入力された引数のモジュラスを2で割って求めます。引数に5を与え、それを2で割ると、余りは1になります。

上のスクリプトのラムダ関数には、名前がつけられていないことに気がつくだろう。単に、識別子 remainder に割り当てられた関数オブジェクトを返しているだけです。しかし、匿名であるにもかかわらず、通常の関数を呼び出すのと同じように呼び出すことができます。その文は

lambda num: num % 2


は次のように似ています。

def remainder(num):
    return num % 2


ラムダ関数のもう一つの例です。

product = lambda x, y : x * y


print(product(2, 3))


出力

6


上で定義されたラムダ関数は、2つの引数の値の積を返す。

なぜラムダ関数を使うのか?

ラムダ関数は、ある関数が短期間だけ必要な場合に使用します。これは、高階の関数、つまり他の関数を引数に取る関数の引数として関数を渡したいときによく使われます。

次の例では、他の関数の内部で匿名関数を使用する方法を説明します。

def testfunc(num):
    return lambda x : x * num


上の例では、引数を1つ取る関数があり、その引数に未知数を乗じることになっています。それでは、上記の関数の使い方を説明します。

def testfunc(num):
    return lambda x : x * num


result1 = testfunc(10)


print(result1(9))


出力

90


上のスクリプトでは、ラムダ関数を使って、渡された数字に10を掛けている。同じ関数で1000倍することができる。

def testfunc(num):
  return lambda x : x * num


result2 = testfunc(1000)


print(result2(9))


出力

9000


testfunc()`関数を使って、上記の2つのラムダ関数を一つのプログラムの中で定義することができます。

def testfunc(num):
    return lambda x : x * num


result1 = testfunc(10)
result2 = testfunc(1000)


print(result1(9))
print(result2(9))


出力

出力 “`
90
9000


ラムダ関数は `map()` や `filter()` などのPythonの組み込み関数と一緒に使うことができます。

以下の章では、ラムダ関数と様々なPythonの組み込み関数の使い方を説明します。



### filter()関数

Pythonの `filter()` 関数は、ラムダ関数とリストを引数にとります。以下のような構文になります。

filter(object, iterable)


ここで `object` は、ブール値を返すラムダ関数である必要があります。この `object` はイテラブルの各アイテムに対して呼び出され、評価されます。その結果、すべてのアイテムに対して `True` か `False` のどちらかが返されます。この関数は、1つのイテラブルを入力として受け取ることができることに注意してください。

ラムダ関数と評価されるリストは、 `filter()` 関数に渡されます。filter()` 関数は、ラムダ関数によって評価されたときに `True` を返す要素のリストを返します。以下の例を見てみましょう。

numbers_list = [2, 6, 8, 10, 11, 4, 12, 7, 13, 17, 0, 3, 21]

filtered_list = list(filter(lambda num: (num 7), numbers_list))

print(filtered_list)


出力

[8, 10, 11, 12, 13, 17, 21]


上の例では、整数のリストを含む `numbers_list` という名前のリストを作成しました。このラムダ関数は `filter()` 関数の引数として渡され、フィルタリングの結果は `filtered_list` という名前の新しいリストに保存されます。



### map()関数

map()`関数は、関数オブジェクトとリストを受け取るもう一つの組み込み関数である。map関数のシンタックスは以下の通りである。

map(object, iterable_1, iterable_2, …)


map()` 関数に渡すイテラブルは、辞書やリストなどです。map()` 関数は、基本的にラムダ関数で定義されたロジックに従って、入力のイテラブルの各項目を出力のイテラブルの対応する項目にマップする。次のような例を考えてみましょう。

numbers_list = [2, 6, 8, 10, 11, 4, 12, 7, 13, 17, 0, 3, 21]

mapped_list = list(map(lambda num: num % 2, numbers_list))

print(mapped_list)


出力

[0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 1, 1]

“`

上のスクリプトでは、乱数からなるリスト numbers_list を用意しています。次に map() 関数を呼び出して、ラムダ関数を引数として渡す。このラムダ関数は、各数を 2 で割った余りを計算します。マッピングの結果は mapped_list という名前のリストに格納されます。最後に、リストの中身をプリントアウトする。

結論

Pythonでは、ラムダ関数は名前を付けずに宣言された1行の関数で、任意の数の引数を持つことができますが、式は1つしか持つことができません。このような関数は、Pythonの def キーワードを使って宣言された通常の関数と同じように振る舞うことができます。ラムダ関数はしばしば他の関数への引数として渡されます。

この記事では、よく使われるラムダ関数の構文、ユースケース、例について説明しました。

タイトルとURLをコピーしました