Python lambda(ラムダ式 無名関数)を理解して活用しよう
lambdaを使うと関数定義を簡潔に表現することができます。
処理内容が少ない関数を実装したい時に使用します。通常の関数表現「def文」との違いや使い所を解説して
いきます。
lambdaは関数作成方法のひとつ
lambdaとは
lambdaは関数作成方法のひとつです。無名関数とも呼ばれています。
def文ですと「def func(args):」のようにfuncなどの関数名が必要ですがlambdaは無名関数の名の通り関数名を表記する必要がありません。
関数名が無いので変数に直接戻り値を返す際に使用されます。
defとlambdaの違い
defとlambdaの違いはdefは宣言文(ステートメント)であり、lambdaは式です。
defを使う場合、事前に宣言が必要となりますが、lambdaは式ですので式として簡潔に表現できます。
例として2乗を求めるプログラムをdefとlambdaで記述します。
def文で記述
def square(x):
result=x**2
return result
y=square(2)
print(y)
結果:4
lambdaで記述
y = lambda x: x**2
print(y(2))
結果:4
どうでしょうか。
簡単な関数であればlambdaでの記述のほうが簡潔に記述できることがわかるかと思います。
尚、Pythonコーディング規約PEP8ではlambdaに名前を付与するのは本来、非推奨ですが今回は便宜上名前をつけて記述しています。
(文法的にはエラーではありません。)
lambdaの使い時
上記のようにlambdaは短い処理を関数化したいときに適しています。
では、次に使い方を説明していきます。
lambdaの使い方
lambdaの使い方
では、lambdaの基本的な使い方をみていきましょう。
lambdaは次のように記述します。
lambda_引数:処理内容
また、lambda式は複数行にまたがって記述はできません。
(1行で処理内容を書ききる必要あり)
(注意:_アンダースコアは実際の記述では半角スペースになります)
先ほどの2乗を求めるプログラムを例に解説します。
y = lambda x: x**2
print(y(2))
結果:4
変数(y)に2乗した値を代入するプログラムになります。
右辺にまず、lambdaを記述し、次に引数(x)を記述しコロンで区切ります。
そして処理内容、今回の場合、引数を2乗する処理を記述します。
引数を複数渡すこともできます。
例)引数xとzを掛け算をする
y=lambda x,z:x*z
print(y(5,5))
結果:25
lambdaの利用シーン
lambdaの利用シーンとしてはfilter関数、map関数やsorted関数と一緒に使われることが多いです。
上記の関数は引数に関数を渡します。その際にlambdaを使う事によって簡潔に表現することができます。filter関数を例に記述してみます。
filter関数は条件に合致するものを抽出する関数です。filter関数は以下のように記述します。
filter(関数,リストなどのオブジェクト)
※第一引数にlambdaを使います。
例)数値リストから90より大きい数値を抽出する処理
lambda無し
nums = [100, 200, 50, 40]
results = []
for num in nums:
if num > 90:
results.append(num)
print(list(results))
lambda有り
nums = [100, 200, 50, 40]
results = filter(lambda num : num > 90, nums)
print(list(results))
def文をlambdaを使って記述してみよう
次にdef文で記述されたプログラムをlambdaで表現してみましょう。
例として苗字リストに呼称「さん」を付与する処理で説明します。
今回はlambdaを先ほど紹介したmap関数の引数として使います。
map関数はリストなどの複数要素を持つデータに対して、その要素に同じ処理を行う関数です。
map関数は以下のように記述します。
map(関数,リストなどのオブジェクト)
※第一引数にlambdaを使います。
では、def文を使い記述していきます
pre_list=['山崎','鈴木','浅村','島内']
def add_func(name):
result_name=name+'さん'
return result_name
add_list=list(map(add_func,pre_list))
print(pre_list)
print(add_list)
結果 [‘山崎’,‘鈴木’,‘浅村’,‘島内’,]
[‘山崎さん’,‘鈴木さん’,‘浅村さん’,‘島内さん’,]
次にlambdaを使い記述していきます。
pre_list=['山崎','鈴木','浅村','島内']
add_list=list(map(lambda name:name+'さん',pre_list))
print(pre_list)
print(add_list)
結果 [‘山崎’,‘鈴木’,‘浅村’,‘島内’,]
[‘山崎さん’,‘鈴木さん’,‘浅村さん’,‘島内さん’,]
pre_listに苗字をリストを格納し、それに対してmap関数で「さん」を付与しadd_listに格納しています。
map関数の第一引数に「さん」を付与する関数を第二引数に第一引数へ渡すリストを指定しています。
ここで注意すべきは、map関数はmapオブジェクトというデータを返すということです。
そのため、list関数を使ってリストに変換しています。
lambdaを使うことによってスッキリと表現できました。
まとめ
これまでお伝えしてきた通り、lambdaは非常に便利な機能ですが、1行で書き切る必要があります。
つまり、複雑な処理や複数行にまたがる処理を書くことはできないということです。
しかしfilter関数などと一緒に使ったりすることで、def文で記述するほどでもない処理の際に利用されます。
状況に応じて使い分けしていただければと思います。