0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【Python中級者への道】lambda式を使う

Posted at

まとめへのリンク

はじめに

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を定義するしかないんでしょうか...(ラムダでできると楽なのですが)

参考文献

0
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?