こんにちは。ホビーハッピーです。
今回はpythonのlambda(ラムダ)についての解説です。
自分自身、【んーまああることは知ってるけど、つかわなくてもいっかな…】
なんて思っていたのですが、
基本の解説としてlambda(ラムダ)が登場することもあるので、
一度しっかり理解しておく必要があると思ったので記事にしました。
python以外の他言語でもlambda式は登場しますが、
とりあえずpythonのlambdaに絞って解説します。
ちなみに、lambda
初見でラムダなんて読めないですよね…
Youtubeチャンネルにさまざまな動画を上げています。
↓↓↓こちらからYoutubeチャンネルにアクセス!! ↓↓↓
↓↓↓↓これまでのPythonの記事についてはこちら↓↓↓↓
ほかにもpython関連でちょっと素通りしてしまいそうな内容についてまとめています↓↓
pythonのlambda(ラムダ)って、結局なんなの?
まずpythonにおけるlambda(ラムダ)について解説します。
日本語で言い換えると意外とすんなり入ってくるかもしれません。
pythonのlambdaは、
【無名関数】
です。
無名関数の無名はいったん置いておいて、
関数だということが理解してもらえればいいです。
関数なので、引数もあるし、返り値もあります。
ラムダ式なんて言われてもピンとこないと思いますが、
関数の一種だと思えば、そんなに抵抗なくなるんじゃないでしょうか??
lambda(ラムダ)を使う前に、普通のpythonの関数を復習。
先ほど、pythonのlambda(ラムダ)は、【無名関数】
というお話をしましたが、
まずは一般的なpythonで使う関数について復習する必要があります。
それでは一つ関数を用意しましょう。
できるだけ単純にするために、
次のような条件の関数を用意しました。
使い道は限りなく少ないですが、
例だと思って許してください。
それでは、関数はdefを使って記述しますから、
こんな感じになりますよね?
def plus5(x):
return x+5
さて、何の違和感もないこのplus5という関数ですが、
ちゃんと機能しているかも一応確認しておきましょう。
print関数を使って、実際に引数x=3として実行してみましょう。
def plus5(x):
return x+5
print(plus5(3))
ちゃんと8になったことが確認できたかと思います。
まあこれだけ単純だと、
x=5
y=3
print(x+y)
こんな感じでやっても同じ結果が得られますよね。
わざわざ関数(def)でおく必要があるのか?と。
というわけで、
この、【いちいち関数を定義するのめんどくね?】
という場合に登場するのがlambda(ラムダ)になります。
lambda(ラムダ)を使うと、どうなるか?
さて、先ほど、
【いちいち関数を定義するのがめんどくね?】
となりましたが、lambda(ラムダ)を使用することにより、
めんどくささを緩和できるんです。
具体的にlambda(ラムダ)を使用して書き換えたコードはこちらです。
print((lambda z:z+5)(3))
さて、今回は関数(def)の記述はありません。
かわりにlambdaが登場しています。
このlambdaの書き方ですが、
基本的な並びに関して解説します。
具体的なlambda(ラムダ)の使い方。
さて、注目してもらいたいのが、
(lambda 引数:内容)(入力値)
となっているところです。
それぞれ解説すると、冒頭で定義したplus5関数がlambdaというところに入っていると思って下さい。
さらに、引数のzは、plus5関数でいうところのxです。
内容のところは、plus5関数の【:】以降の処理です。
最後に入力値は、plus5関数を実際に使ったprintの3ですね。
念のためplus5関数をもう一度載せておきます。
def plus5(x):
return x+5
print(plus5(3))
↑これと、
↓これは全く同じことをしている。
print((lambda z:z+5)(3))
冒頭で話した通り、lambda(ラムダ)は無名関数です。
もともとplus5という関数名で行っていた内容が、
文字通り【無名】の関数lambdaに置き換わっています。
もうちょっと具体的なイメージを持ってもらうために、
関数を2つほど増やしてみましょう。
def plus5(x):
return x+5
def plus4(x):
return x+4
def plus3(x):
return x+3
print(plus5(3))
print(plus4(3))
print(plus3(3))
print((lambda z:z+5)(3))
print((lambda z:z+4)(3))
print((lambda z:z+3)(3))
上のprintが関数を置いた場合。
下のprintがlambdaを使用した場合の記述です。
注目するのは、lambdaのほうは、無名関数ですから、
【:】以降がことなるだけで、関数名は特になにもありません。
イメージとしては、一行で全部まとめて書いちゃうって感じですね。
pythonのlambda(ラムダ)の使いどころと気を付けるところ。
ここまでpythonのlambda(ラムダ)について解説してきましたが、
使いどころは、やはりソースコードをスッキリさせたいときですよね。
関数でソースコードが埋め尽くされるよりは、
スッキリさせたほうが良い場合が多いかと思います。
ただ、注意点として個人的に思っているのは、次の2点です。
一つずつ解説していきます。
繰り返し登場する機会がある場合。
lambda(ラムダ)が無名関数という話は何度もしているので、
理解していただいていると思いますが、
無名だからこそのデメリットもあると思っています。
例えば、plus5関数は、5を足す関数でした。
関数の名前からしても、5を足すんだな。
というのはわかってもらえると思います。
また、これが何度も登場する場合、
毎回lambdaで記述すると、それはそれで面倒じゃないですか?
それだったら関数を用意しておいて、
あ。ここでこの関数をもう一度使ってるな。
と理解できるような気がします。
また、デバッグのときも、関数になっていれば、
ブレークポイントを入れて値がどうなっているか追うことも簡単です。
関数が複雑で、その関数に理解しにくいところがある場合。
そもそもですが、1行で記述しきれないような長くて、
複雑な処理を行うものについては、lambdaだと
見づらい上に毎回それを書くのは面倒だし、
さらに言うと、何をやっているのか【:】以降の内容を、
毎回チェックする必要があります。
もし1か所だけ変数を間違えていたり、符号を間違えていると、
それはそれで面倒ですよね?
それだったら、関数をちゃんと置いて、
それを意識的に使ったほうが良いと思っています。
まとめ
今回はpythonのlambda(ラムダ)についての解説をしました。
lambda(ラムダ)を使用するメリットは、
ソースコードをスッキリさせて、行を見やすくすることですが、
やりすぎると逆に読みにくくなる可能性があるので
注意が必要かな…なんて思ったりして。
コメント