PSM

Pプログラミング S初心者の Mメモ書き

map関数とlambda式

python始めて1年くらい,map関数について復習するついでに,ようやくlambda式について勉強しました.

map関数

競技プログラミングをやっていて,標準入力を受け取るときに何も考えずに

a = list(map(int, input().split()))

とか書いたりしてますが,実はこのmapっていう関数は何?intとinput().split()って2つの引数あるけどこれ何?と実はあまり知らない状態が続いていました.

調べた結論から言うと,map()というのは1つ目の引数で指定した名前の関数を2つ目の引数で指定したリストの要素一つ一つに当てはめていってくれる関数のようです.
つまり,ここではinput().split()で受け取られた入力のリスト(str型)を,一つづつ全てint型に変換してくれるという処理を行なっているわけでした.

ここではintという関数を使っていますが,この部分には自分で定義した関数を用いることができます.
例えば引数の2乗を返す関数fを定義して,

def f(a):
    return a**2

list(map(f, [1,2,3,4]))

とすれば

[1, 4, 9, 16]

とやってくれます.便利ですね.
注意点ですが,map関数はそのままでは結果をmap objectという形式で返すようになっているため,printなどがしたい場合はlistをかませる必要があります.

lambda式

ところで,上の式では自作関数fをいちいち定義していましたが,これをもっとスマートにやる書き方があります.
それがlambda式です.

正確に言うとlambda式は,無名関数を定義する記法の1つであり,関数の定義文を式として扱うことができるのです.
...なんのこっちゃっていう話ですね.
調べたところによると,lambda式は

lambda 変数:返り値の定義

のように書くとのことです.実際に書いて動かしてみます.

lambda a: a>0

すると,

<function __main__.<lambda>>

なるほど,よくわかりませんが,ちゃんと関数として定義されているようです.

この関数に実際に変数を与えて処理を行わせるには,以下のように書きます.

(lambda a: a>0 )(1)

このように書けば,変数の1が0より大きいかどうかの判定が行われ,

True

と帰ってきます.

lambda式は式なので当然変数に与えることもできて,

f = lambda a: a>0 

と関数定義のように書くこともできます.この変数fは,map関数のときに普通に定義したfのように使うことができて

f(1)
True

となります.

さて,ここからがlambda式の便利なところです.
これを使えば,上のような0より大きいかどうかを判定する関数を,引数としてmap関数に直接与えることができます.
つまり,1行で書けます.

list(map(lambda a:a>0, [-1,0,1]))

結果は

[False, False, True]

便利ですねえ.