Pythonのlambda(ラムダ式:無名関数)の使い方のイメージ画像

Pythonのlambda(ラムダ式:無名関数)の使い方

  • 公開日:2018/11/06
  • 更新日:2018/11/07
  • 投稿者:n bit

Pythonで関数名を持たない無名関数をlambda(ラムダ式)で記述する方法を解説。関数名の指定が必要ないためちょっとした実行処理であれば1行で簡素に記述することができ、関数の引数に簡単な独自関数を渡す場合などに利用します。

  • Python

この記事は約 分で読めます。(文字)

Pythonのlambda(ラムダ式:無名関数)の使い方

lambda(ラムダ式:無名関数)は『無名関数』と言われるように関数の名前を持たず、そして関数のような役割を持っていますが基本的には式です。そのため通常の関数のように機能を使い回したりすることができず1回限りの実行処理となります。

ここまで聞くとデメリットばかりのように感じますが、関数にするまでもないような簡易な実行処理の場合は逆にlambdaで記述することで簡潔に記述することができ非常に便利です。

通常の利用方法は関数の引数に渡す簡易な関数をラムダ式に置き換えることで全体的な記述量を抑えることができ直感的で管理も楽になります。

例えば下記のようなリスト内の文字列を全て小文字化して返してくれるコードを見てみましょう。

words = ['Python', 'CSS', 'HTML', 'JavaScript']


def word_edit(word_list, func):
new_words = []
for word in word_list:
new_word = func(word)
new_words.append(new_word)

return new_words

def word_lower(word):
return word.lower()

print(word_edit(words, word_lower))

出力結果

['python', 'css', 'html', 'javascript']

『word_lower』関数は実質関数名と実行処理の2行しかありません。『word_edit』関数の引数に渡す関数の種類が今回のように1種類だけであればこのような記述方法でもそこまで負荷にならないでしょう。

しかし『word_edit』関数に渡す関数の種類が増えていく場合は増えた分引数に渡す関数も増やしていく必要があります。例としてリスト内の文字列を全て大文字化する実行処理を足してみましょう。

words = ['Python', 'CSS', 'HTML', 'JavaScript']


def word_edit(word_list, func):
new_words = []
for word in word_list:
new_word = func(word)
new_words.append(new_word)

return new_words

def word_lower(word):
return word.lower()

def word_upper(word):
return word.upper()

print(word_edit(words, word_lower))

print(word_edit(words, word_upper))

出力結果

['python', 'css', 'html', 'javascript']

['PYTHON', 'CSS', 'HTML', 'JAVASCRIPT']

極端に行数が増えるわけでは無いのですが、たかがこれだけの機能のために関数を組んで行数を増やしているのは管理のしやすさの面や後でコードを読み直すことを考えてもあまりプラスではありません。

このような不便さを解消してくれるのがlambda(ラムダ式:無名関数)です。

lambda(ラムダ式:無名関数)の記述方法

この後、先程の事例をlambdaを使って書き換えしていきますが先にlambdaの記述方法について説明しておきましょう。lambdaの記述方法は『lambda』の後に引数を指定し、間に『:』を挟んで返り値(実行処理)を記述します。

最初に記述する『lambda』は予約語で「これからラムダ式を記述しますよ」と言う宣言です。関数を記述するときに最初に指定する予約語『def』と同じ役割を果たします。

  • lambda 引数:返り値(実行処理)

では実際に値を入れて確認してみましょう。推奨される記述方法ではありませんが動きを確認するため一時的に下記のようにコードを記述しています。

word_lower = lambda word:word.lower()

print(word_lower('Python'))

出力結果

python

引数に渡した『Python』の文字列が小文字の『python』になって返されているのが確認できます。このように1行の式で関数のような処理を記述できてしまうのがlambdaのメリットです。

lambdaを使ったサンプルコード

それでは最初の事例をlambdaで置き換えてみます。間の『word_lower』と『word_upper』関数がなくなりより直感的で簡素なコードとなりました。

words = ['Python', 'CSS', 'HTML', 'JavaScript']


def word_edit(word_list, func):
new_words = []
for word in word_list:
new_word = func(word)
new_words.append(new_word)

return new_words

print(word_edit(words, lambda word:word.lower()))

print(word_edit(words, lambda word:word.upper()))

出力結果

['python', 'css', 'html', 'javascript']

['PYTHON', 'CSS', 'HTML', 'JAVASCRIPT']

違う処理を加えたい場合は最終の『word_edit』関数を呼び出す1行を追加していくだけで様々な処理を行うことができます。

例えば頭3文字を小文字化して抽出したい場合は下記のような1行追加するだけで実行可能です。

print(word_edit(words, lambda word:word[0:3].lower()))

同じ実行処理を何度も違う場所で呼び出す場合は関数の方が便利ですが、今回のように1つの関数の引数に様々なバリエーションの簡易処理を渡す場合はlambdaを利用する方が便利といえます。

実行処理に名前をつけて何度も呼び出す必要がある場合は『関数』名前が不要で1回のみの簡易な関数的実行処理を必要とする場合は『lambda』と考えておけばよいでしょう。

今日のdot

実は上記のような処理であればmap関数とlambdaを使うことで3行で表すことが可能です。

words = ['Python', 'CSS', 'HTML', 'JavaScript']


print(list(map(lambda word:word.lower(), words)))
print(list(map(lambda word:word.upper(), words)))

出力結果

['python', 'css', 'html', 'javascript']

['PYTHON', 'CSS', 'HTML', 'JAVASCRIPT']

とてもシンプルなコードになりましたね。このようにlambdaは引数に関数を渡すことができる組み込み関数『map関数、filter関数、sorted関数、min関数、max関数、』等と非常に相性が良く記述するコード量を減らし管理しやすくしてくれる機能です。

覚えておいて使える場面では積極的に使っていくようにしましょう。