まとめへのリンク
はじめに
Pythonの勉強をするために、acopyという群知能ライブラリを写経していました。
acopyでは、多くのPythonの面白い文法・イディオムが使われており、その中でも便利だなぁというのをまとめています。
今回は、Pythonのlambda式について学びます。
lambda式とは?
ラムダ式とは、他の多くのプログラミング言語でも利用される概念で、無名関数の意味をさします。
名前をつけるまでもない、利用するスコープが非常に小さい場合に、無名な関数をその場で定義して使い捨てる というのがラムダ式です。
C++では[](){}
の表記で利用できます。
lambda式の例
lambda式はlambda 引数: 処理
の形で表記します。
処理の結果として、必ず値が返されるという特徴があります。
例えば、2つの整数の引数を足し算するadd関数、そしてそれをlambdaで表したlm_add関数を作成してみます。
def add(x, y):
return x + y
lm_add = lambda x, y: x + y
x = 10
y = 40
'''
50
50
'''
print(add(x, y))
print(lm_add(x, y))
add関数と同じ挙動を示すのがlm_add関数です。
引数$x, y$を受け取り$x+y$を計算したあと、強制的にreturnされます。
通常の関数と同様に、可変長引数を利用できます。
f = lambda *args, **kwargs: print(args, kwargs)
'''
(10, 'a') {'hello': 'world'}
'''
f(10, 'a', hello='world')
活用例
lambda式は、基本的に使い捨てで名前をつけるまでもない、極小のスコープのみで利用します(するべきと考えています)。
例えば
- ソートの基準として
- 最大値の基準として
など組み込み関数と組み合わせて使用することが多いです。特に競技プログラミングでは多用します。
例えば、以下はタプルの配列を第$1$要素を基準として昇順に並べ、もし同じならば第$0$要素で昇順にさらに並び替えます。
tuples = [(10, -3), (4, 10), (-4, 13), (-20, -50), (-20, 1), (0, 0), (-22, -50)]
tuples = sorted(tuples, key=lambda x: (x[1], x[0]))
'''
[(-20, -50), (-22, -50), (10, -3), (0, 0), (-20, 1), (4, 10), (-4, 13)]
'''
print(tuples)
以上のような比較関数はわざわざスコープの外に定義するまでもないため、また、関数の位置が遠くなり、処理を追う負担を減らすため、lambdaで定義すると良さそうです。
最後に
lambdaについて見てみました。
特に競技プログラミングでPythonでやっていると多用します。
他の言語でもラムダ式を活用していきたいです。
Pythonだと$2$つの要素で入れ替えるソート(C++のソートなど)
はクラスにeq, lt
を定義するしかないんでしょうか...(ラムダでできると楽なのですが)