2019/11/24
2020/04/14
Python入門 全人類がわかるlambda(ラムダ)式
Pythonの文法の中でも少し発展的な内容のlambda(ラムダ)式は、正直に言って無理して使う必要のない記法でもあります。
(((((しかし高校生にとってブラックコーヒーが飲めることがステータスになったように、Python初心者にとってlambda(ラムダ)式を書けるようになることは一つのステータスになるのではないでしょうか))))))
今回はそんなlambda(ラムダ)式のメリットや使い所、表記について解説していきます!
目次
lambda(ラムダ)式とは
そもそもlambda(ラムダ)式とは、無名関数と呼ばれる関数を書くための記法になります。
数字と演算子を使って書いたものが数式と呼ばれるように
lambda(ラムダ)式記法を使って書いたものが無名関数と呼ばれます。
正直細かいところはどうでもいいので、無名関数とlambda(ラムダ)式は関係あるんだなぁ~くらいの認識でいてください。
lambda(ラムダ)式はいつ使う?
lambda(ラムダ)式が使えると、ちょっとした処理を一行でまとめて書くことが出来ます。
名前付きの関数を1つ定義するのは面倒くさいけど、対象に処理を加えたいときに使います。
例えば「このリストだけ要素を二乗したいなぁ~」なんていう時はまさにlambda(ラムダ)式の出番です。
lambda(ラムダ)式の書き方
lambda(ラムダ)式の基本的な書き方は次のようになっています。
lambda 引数1,引数2...: 処理
例えばこんな感じです。
lambda a,b: a+b
lambda(ラムダ)式の引数に値を渡したい時は次のように書くことで値を渡せます。
(lambda 引数:処理)(渡す値) #① #実際に書いてみるとこんな感じ。(見にくくなるのでprint()は省略します) (lambda a,b:a+b)(1,99)
100
もしくはlambda(ラムダ)式ごと変数に渡してあげてから値を渡すことも出来ます。
func = lambda 引数1,引数2...: 処理 #② print(func(渡す値)) #実際に書いてみるとこんな感じ。(見にくくなるのでprint()は省略します) func = lambda a,b:a+b func(1,199)
200
lambda(ラムダ)式を用いた演習
折角なのでlambda式を使っていくつか演習をしてみましょう!
1,変数gretに文字列”Hello”を格納して、Worldと結合させて出力せよ。
2,変数num1とnum2に数字3と9を格納して、それぞれを二乗した後にそれらを加算して出力せよ。
3,任意の数字を格納した変数xが偶数なら”True”、奇数なら”False”を出力せよ。
Hello World #1問目 90 #2問目 True #3問目 x = 6の時
解答
解答例は次のようになっています。
gret = "Hello" #1問目 (lambda gret:gret+"World")(gret) num1 = 3 #2問目 num2 = 9 (lambda num1,num2:num1**2+num2**2)(num1,num2) x = 6 #3問目 (lambda x: x%2 == 0)(x)
以上がlambda(ラムダ)式の大体の説明になります。
次にlambda(ラムダ)式が活躍する高層関数との組み合わせについて軽く説明します。
高層関数とは
高層関数とは、”引数に関数を取る関数“です。例としてmap関数やfilter関数があります。
map関数はリストの全ての要素に関数処理を適用してくれる関数です。
filter関数はリスト全ての要素に関数処理を適用し、Trueのものだけを返してくれる関数です。
どちらもリストの全ての要素に対して関数処理を適用してくれるところがとても便利です。
高層関数の別の記事で詳しく説明します!
lambda(ラムダ)式と高層関数
高層関数は引数に関数を取るため、何かしらの処理をする関数を引数として渡すことが出来ます。
もちろん普通の関数を引数として渡すことも出来ますが、lambda(ラムダ)式で書いた無名関数を引数として渡してあげるととても綺麗に書くことが出来ます。!
[演習] list_1 = [0,1,2,3,4,5,6,7,8,9] の全ての要素を2乗して、新たにlist_2に格納してください。
※比較のため普通に関数を定義した場合とlambda(ラムダ)式を用いた場合の2通り書いてください
list_1 = [0,1,2,3,4,5,6,7,8,9] list_2 = [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
#普通に関数定義した場合 list_1 = [0,1,2,3,4,5,6,7,8,9] def squr(x): xx = x**2 return xx eq1 = list(map(squr,list_1)) print(eq1) #5行 #lambda(ラムダ)式を用いた場合 eq2 = list(map(lambda x:x**2,range(10))) print(eq2) #2行
このようにlambda式と高層関数を組み合わせるとコードの行数を大幅に省略することが出来ました。
※コードは行数を減らせばいいというものでもないので、見やすさ重視で書いてください。
lambda(ラムダ)式とfor文
lambda(ラムダ)式でfor文を書くのはどうすればよいのでしょうか?
lambda(ラムダ)式は一行で処理を書く必要があるためlambda(ラムダ)式の中にfor文を書くことは出来ません。
複数行に渡ってlambda(ラムダ)式の中の処理を書きたい場合は、普通に関数定義して書きます。
しかし、for文のような動作をするコードを書くことは出来ます!
そう!お気づきの通りmap関数とlambda(ラムダ)式の組み合わせです。
先ほどの演習1の問題をもう一度見てみましょう!
[演習] list_1 = [0,1,2,3,4,5,6,7,8,9] の全ての要素を2乗して、新たにlist_2に格納してください。
先程はこれを関数定義やlambda(ラムダ)式で書きましたが、for文で書くことも出来ます。
list_1 = [0,1,2,3,4,5,6,7,8,9] #普通に関数定義した場合 def squr(x): xx = x**2 return xx eq1 = list(map(squr,list_1)) print(eq1) #lambda(ラムダ)式を用いた場合 eq2 = list(map(lambda x:x**2,range(10))) print(eq2) #2行 #for文で書いた場合 list_2 = [] for i in list_1: square = i**2 list_2.append(square) print(list_2)
lambda(ラムダ)式とIf文
lambda(ラムダ)式を使ってif文を書くことは出来ます。
lambda 引数1,引数2...: 処理
lambda(ラムダ)式の基本的な書き方の処理の部分にif文を加えるだけです。
この時、if文を含む処理の部分には三項演算子という記法を使って書きます!
#三項演算子 lambda 引数1,引数2...:(条件がTrueのときの値) if (条件) else (条件がFalseのときの値)
この三項演算子とlambda(ラムダ)式を組み合わせることで、一行でif文を書くことが出来ます!
演習をしてみましょう!
[演習]与えられた数字の偶数か奇数を判定するプログラムを作りましょう。
この演習をlambda(ラムダ)式を使って解答してください!
lambda(ラムダ)式を使わない場合の解答は次のようになります。
def even_odd(i): if i % 2 == 0: print("偶数です") else: print("奇数です") even_odd(10) #偶数です。
いかがでしょうか?
解答例は次のようになります!
even_odd_lambda = (lambda x:"偶数です" if i % 2 == 0 else "奇数です") even_odd_lambda(5) #偶数です
さて、これでlambda(ラムダ)式を使ってfor文とif文を書けるようになりました。
最後に総復習できる演習問題をやってみましょう。
演習問題
lambda(ラムダ)式とif文とfor文を組み合わせた問題
[演習] lambda式を使って list_1 = [0,1,2,3,4,5,6,7,8,9,10] の全ての要素について偶数か奇数か判定して、その結果をlist_2に格納してください。
['偶数です', '奇数です', '偶数です', '奇数です', '偶数です', '奇数です', '偶数です', '奇数です', '奇数です', '偶数です']
いかかがでしょうか?
この問題ではlambda式とmap関数とif文とfor文と三項演算子とリスト化の知識を使います!
解答は次のようになっています!
list_1 = [0,1,2,3,4,5,6,7,9,10] #どうしても一行で書きたかったコード list_2 = list(map((lambda x:"偶数です" if x % 2 == 0 else "奇数です"),list_1)) #見やすく書いたコード func = (lambda x:"偶数です" if x % 2 == 0 else "奇数です") list_2 = list(map(func,list_1))
以上がlambda(ラムダ)式の説明となります!
ちょっとした関数処理を加える時にちょうどいい記法なので、適材適所で活用していきましょう!
Recommended