この記事では、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を用いた方がシンプルな実装になりますね。
この記事もチェック:Pythonでの変数の定義やスコープ、削除、globalキーワードを解説していく
無名関数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
この記事もチェック:Pythonのoct関数を使って整数(10進数)を8進数に変換する方法
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
この記事もチェック:Pythonのmapメソッドの使い方|ラムダ関数や引数が複数の場合の使い方も解説
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())
ただし、ラムダ関数は常に同じ値を返すので、ラムダ関数を使うよりも普通に変数を使った方が良いでしょう。
この記事もチェック:Pythonのexec関数の使い方|引数や変数の使い方を解説する