lambda式(ラムダ式)
このページでは豊富な例を用いてPythonのlambdaの使い方を学ぶことができます。
lambdaはPythonで無名関数を作成するのに使用されるキーワードです。
lambdaを使用して作成した関数はdefで作成した関数と同様にfunctionクラスのオブジェクトであり、
関数オブジェクトを指定できる場所であればどこでも指定することができます。
ユーザ定義関数を用意するほどでもない場面でlambdaを使用した関数を代わりに使用すると、 よりシンプルにコードを表現することができます。
# 明示的な戻り値がある場合でもreturn文は使用しません
# 定義(引数あり)
lambda 引数: 処理
# 定義(引数なし)
lambda: 処理
TL;DR
基本
# ユーザ定義関数(引数あり)
def add_one(num):
return num + 1
print(add_one(100))
==> 101
# 上記関数の書き換え
# lambda式を使用した記述(lambda式を識別子に代入するのは非推奨ですが、便宜上使用しています)
add_one_lambda = lambda num: num + 1
print(add_one_lambda(100))
==> 101
# lambda(複数引数あり)
lambda1 = lambda str1, str2: f'{str1}:{str2}'
return_value1 = lambda1('python', 'javascript')
print(return_value1)
==> python:javascript
# ユーザ定義関数(引数なし)
def print_python():
print('Python')
print_python()
==> Python
# 上記関数の書き換え
# lambda(引数なし、返り値なし(None))
print_python_lambda = lambda: print('Python')
print_python_lambda()
==> Python
# lambda(引数なし、返り値あり)
lambda2 = lambda: 'FooBarNinja'
print(lambda2())
==> FooBarNinja
# その場での呼び出し(引数なし、返り値なし)
(lambda: print('Lambda'))()
==> Lambda
# その場での呼び出し(引数あり、返り値あり)
string1 = (lambda string: string + '!')('Howdy')
print(string1)
==> Howdy!
関連情報:def(関数定義)の使用方法
lambdaの実践的な使用場面
# listクラスのsortメソッドにlambda式を使用する
# 3からの距離が小さい順にソートする
list1 = [1, 2, 3, 4, 5]
list1.sort(key=lambda e: abs(3 - e))
print(list1)
==> [3, 2, 4, 1, 5]
# ユーザ定義関数を使用して上記と同じ処理をする場合
def sort_key_func(e): return abs(3 - e)
list2 = [1, 2, 3, 4, 5]
list2.sort(key=sort_key_func)
print(list2)
==> [3, 2, 4, 1, 5]
# sorted関数
list3 = [{'name': 'Lisa', 'age': 26}, {'name': 'John', 'age': 22}]
sorted_list1 = sorted(list3, key=lambda e: e['age'])
print(sorted_list1)
==> [{'name': 'John', 'age': 22}, {'name': 'Lisa', 'age': 26}]
# map関数
# 奇数部分は'odd'、偶数部分は'even'に置き換えるlambda式を定義する
list4 = [1, 2, 3, 4, 5]
map1 = map(lambda e: 'odd' if e % 2 == 1 else 'even', list4)
print(list(map1))
==> ['odd', 'even', 'odd', 'even', 'odd']
# filter関数
list5 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
filter1 = filter(lambda e: e % 2 == 0, list5)
print(list(filter1))
==> [2, 4, 6, 8, 10]
関連情報:sorted関数の使用方法
関連情報:map(組み込み関数)の使用方法
関連情報:filter関数の使用方法
解説
# 定義例
# 明示的な戻り値がある場合でもreturn文は使用しません
# 定義(引数あり)
lambda 引数: 処理
# 定義(引数なし)
lambda: 処理
基本
lambdaを使用することで無名関数を作成することができます。
lambdaを使用して作成する関数は、処理をする式が単一の式に制限されます。
そのため、複雑な処理を表現する関数の定義には不向きですが、
簡易な処理を行う関数はdef
を使用するよりもシンプルに表現できます。
戻り値は単一の式の戻り値が自動的に返るので、return文を使用しないことに注意してください。
また、コード例では便宜上lambdaで作成した関数を識別子(ここでは変数)に代入していますが、 一般的なPythonのコード規約では非推奨ですので注意してください。
# ユーザ定義関数(引数あり)
def show_arg(arg1):
print(arg1)
show_arg('FooBarNinja')
==> FooBarNinja
# 上記関数をlambda式に書き換え
# lambda式を識別子に代入するのは非推奨ですが、便宜上使用しています
show_arg_lambda = lambda arg1: print(arg1)
show_arg_lambda('FooBarNinja Lambda')
==> FooBarNinja Lambda
# 複数引数を用いたlambda式の記述
lambda1 = lambda arg1, arg2: arg1 + arg2
print(lambda1('Python', 'JavaScript'))
==> PythonJavaScript
# ユーザ定義関数(引数なし)
def return_python():
return 'python'
print(return_python())
==> python
# 上記関数をlambda式に書き換え
return_python_lambda = lambda: 'python'
print(return_python_lambda())
==> python
# その場での呼び出し
(lambda e: print(e))('lambda')
==> lambda
関連情報:def(関数定義)の使用方法
lambdaの実践的な使用場面
lambdaを使用する主な場面として、関数オブジェクトを引数にとる高階関数を使用する場面が挙げられます。
いずれも簡易的な処理をする場合に限られますが、
def
を用いたユーザ定義関数を定義するよりもコードの見通しを良くすることができます。
# sortメソッド
list1 = [{'name': 'Lisa', 'age': 40}, {'name': 'John', 'age': 12}]
list1.sort(key=lambda e: e['age'])
print(list1)
==> [{'name': 'John', 'age': 12}, {'name': 'Lisa', 'age': 40}]
# sorted関数(奇数から先に並べるlambda式を指定)
list2 = [1, 2, 3, 4, 5]
sorted_list1 = sorted(list2, key=lambda e: e % 2 != 0)
print(sorted_list1)
==> [2, 4, 1, 3, 5]
# map関数
# 奇数部分は'odd'、偶数部分は'even'に置き換えるlambda式を定義する
list3 = [1, 2, 3, 4, 5]
map1 = map(lambda e: 'odd' if e % 2 == 1 else 'even', list3)
print(list(map1))
==> ['odd', 'even', 'odd', 'even', 'odd']
# filter関数
list3 = [1, 2, 3, 4, 5]
filter1 = filter(lambda e: e % 2 == 0, list3)
print(list(filter1))
==> [2, 4]
関連情報:sorted関数の使用方法
関連情報:map(組み込み関数)の使用方法
関連情報:filter関数の使用方法