次回より『ヒデログ』とご検索ください

【Python入門】5分で分かるlambda式(ラムダ式、無名関数)の使い方

python

ひでひろ
ども、ひでひろ(@hidehirotw)です。lambdaの使い方って意外と難しく、読みずらいですよね。

今回の記事ではlambdaの使い方について分かりやすく解説します。

この記事を読むと分かる事
・lambdaが使えるようになる。

lambda(ラムダ式)とは

Pythonにおけるlambdaは、無名関数を定義する手法です。
公式ドキュメント-lambda

プログラミング言語における無名関数(英語: anonymous functionあるいはnameless function)とは、名前付けされずに定義された関数のことである。無名関数を表現するための方法には様々なものがあるが、近年主流となっているのはラムダ式による記法である。無名関数を表現するリテラル式は、関数リテラル (function literal) とも呼ばれる。値がある場合は関数オブジェクトであるものが多い。Wikipedia

ひでひろ
もう正直なんのことだか分からなくなってきたので、例で見ていきましょう。

lambda(ラムダ式)の書き方

関数=lambda 引数:戻り値

短く書くとこうなりますが、通常の関数だと

def 関数(引数)
    return 戻り値

これが基本になります。実際のコードで見てみましょう。

func1=lambda a:a*2
func1(2)
# 4

func2=lambda a,b:a+b
func2(2,3)
# 5

1行目で引数が2倍になるlambda式を定義しています。
5秒目で2つの引数を足すlambda式を定義しています。

defの代替

defで関数を書いて差を見てみましょう

# 引数を2倍にする
def func1_def(a):
    return a*2
func1_lambda=lambda a:a*2

# 2つの引数を足す
def func2_def(a,b):
    return a+b
func2_lambda=lambda a,b:a+b

if文を3項演算子

lambdaのなかではif文も使えます。if文の書き方は内包表記と同じです。
python 【Python入門】for文の内包表記(if・if-else・enumerate・zip)の使い方

func=lambda x:if x>0 else -x
func(5)
# 5
func(-4)
# 4

コールバック関数(関数を引数に無形関数を使う)

def func(a,b):
    c=b(1,2)
    return a + 'は' + str(c)

func_lambda1=lambda d,e:d+e
func('合計', func_lambda)
# 合計は3

func_lambda2=lambda d,e:d-e
func('差', func_lambda)
# 差は-1

1行目で通常の引数a,bを持つ関数を定義しています。funcの引数bは関数となっていて引数が1,2になっています。この段階では関数bはどのような関数なのか不明です。
5行目で引数d,eを持ち,計算式d+eの無名関数(lambda式)を定義しています。
6行目で関数funcを引数(‘合計’ func_lambda1)で呼び出しています。

9行目で引数d,eを持ち,計算式d-eの無名関数(lambda式)を定義しています。
10行目で関数funcを引数(‘差’ func_lambda2)で呼び出しています。

lambda式って何の役に立つの?

正直個人的にはあまり使いたくはありません。人によっては可読性が落ちるからです。ですが、コード行の節約にはなります。以下のようにコードが短くなります。

org_ls=[1,2,3,4,5]

def func(n):
    return n*2
mp_ls=list(map(func,org_ls))
# [2, 4, 6, 8, 10]

mp_ls=list(map(lambda x:x+2,org_ls))
# [2, 4, 6, 8, 10]

さらに長い文も1行で書けます。7行が1行になっています。

org_ls=[1,2,3,4,5]

def func(n):
    if n>3:
      n= n*5
    else:
      n= n*-5
    return n
mp_ls=list(map(func,org_ls))
# [-5, -10, -15, 20, 25]

mp_ls=list(map(lambda x:x*5 if x>3 else x*-5,org_ls))
# [-5, -10, -15, 20, 25]

「map」は第一引数の関数に第二引数を入れたオブジェクト型になっていてlistで展開する関数です。

まとめ

ひでひろ
lambda式を利用するとコードの節約になります。

ただし、慣れてない人にとっては可読性が落ちるので、チーム開発の時は、メンバーの知識にも気をつけながら使用する必要があります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です