Pythonの無名関数lambdaの使い方|map,filter,reduceの実装方法を解説する

スポンサーリンク

この記事では、Pythonの無名関数であるlambdaについて解説していきます。

スポンサーリンク

Pythonのlambdaについての概要

以下は、Pythonのlambdaについての解説です。

  • 無名関数は lambdaキーワードを使って定義することができます。
  • 無名関数のスコープは、関数内のスコープに限定されます。
  • ラムダ関数は、1つ以上の引数を持つことができますが、 1つの式しか持つことができません 。
  • 式は評価され、その結果がラムダ関数から返されます。
  • ラムダ関数は、map()、filter()、reduce()処理でよく使われます。

    Pythonの無名関数lambdaの使い方

例えば、長方形の面積を求める関数があるとします。

def area_of_rectangle(l, w):
    return l * w

print(f'Area of Rectangle (4, 5) is {area_of_rectangle(4, 5)}')

結果は以下の通りです。

Area of Rectangle (4, 5) is 20

今度は長方形の面積を得るために、lambdaキーワードを使って無名関数を作ってみましょう

rectangle_area = lambda x, y: x* y

print(f'Area of Rectangle (4, 5) is {rectangle_area(4, 5)}')

先ほどの通常の関数に比べると、lambdaを用いた方がシンプルな実装になりますね。

無名関数lambdaはどんな場合に使うべきか?

「いやいや、別にlambdaよりも普通の関数の方が分かりやすくね?」と思うかもしれませんが、lambdaは以下の場合に使うと良いコードが書けます。

  • あまり複雑でないコード。
  • 関数が単一の式しか持たない場合。
  • 関数のスコープを現在のスコープのみに限定したいとき。
  • 関数の引数が map(), filter(), reduce() 関数のような別の関数である場合に有効です。

    map()を使ったラムダ関数の使い方

map()関数は、関数とイテラブルを引数にとります。

関数はイテラブルの各要素に適用され、更新されたイテラブルが返されます。

例えば、整数のリストがあるとしましょう。


各要素に10を掛けて新しいリストを作る必要がある場合、関数を作るのではなく、ラムダ関数を使うとシンプルに実装できます。

list_numbers = [ 1 , 2 , 3 , 4 ]
list_numbers = map(lambda x: x* 10, list_numbers)

for num in list_numbers:
    print(num, end=" ")

結果は以下の通りです。

10 20 30 40 

filter()を使ったラムダ関数の例

組み込みの filter() 関数は、関数とイテラブルを引数として受け取ります。

関数は、イテラブルの各要素に適用されます。

関数がTrueを返した場合は、その要素が返されたイテレートに追加されます

例えば、整数のリストがあり、その中から奇数をすべて取り除くとしましょう。

この時に、ラムダ関数と一緒に filter() 関数を使うと良いです。

list_numbers = [ 1 , 2 , 3 , 4 , 5 , 6 ]
list_numbers = filter(lambda x: x% 2 == 0, list_numbers)

for num in list_numbers:
    print(num, end=" ")

結果は以下の通りです。

2 4 6

reduce()を使ったラムダ関数の例

reduce()関数はfunctoolsモジュールにある関数です。

この関数は関数とシーケンスを引数にとります。


この関数は2つの引数を受け取る必要があります。

シーケンスからの要素は、累積値とともに関数に渡されます。

reduceは説明するよりも、例を見た方が分かりやすいです。

例えば、整数のリストがあり、そのすべての要素の合計を取得したいとします。

ここで、ラムダ関数と一緒にreduce()関数を使いましょう。

from functools import reduce

list_ints = [ 1 , 2 , 3 , 4 , 5 , 6 ]
total = reduce(lambda x, y: x+y, list_ints)

print(f'Sum of list_ints elements is {total}')

結果は以下の通りです。

Sum of list_ints elements is 21

Pythonで引数なしの無名関数lambdaを作ることはできる?

結論から言うと、引数なしのラムダ関数を定義することは可能です。

get_5 = lambda: 5

# 5が表示される
print(get_5())

ただし、ラムダ関数は常に同じ値を返すので、ラムダ関数を使うよりも普通に変数を使った方が良いでしょう。

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