たなブログ 教養を高めて生涯資産を増やすブログ(`・ω・´)

【Python Coding】lambda式(無名関数)とは?概要と使い方を紹介

PR Pythonを学ぶ

こんにちは、TAKです。
今回は、pythonのlambda式(無名関数)の概要と使い方を紹介していきたいと思います。

「lambda」は「ラムダ」と読み、pythonで関数を作れる便利な機能となります。
ただ、「lambda式って今一つ使い方がわからない」と思われている方は意外と多いように思われます。

僕自身もpythonを学びたての頃は、書籍に書いてあるlambdaが何のことなのか、意味やメリットが全くわからなかった論点の一つでした。

そこで今回は、同じように「ラムダ意味わからない」と思われている方向けに、概要と使い方をシンプルに紹介していきたいと思います。

【こんな人に読んで欲しい記事です】

● pythonの「lambda式(無名関数)」の概要を知りたい方

● lambda式の基本を抑えて、可読性の高いコードを書けるようになりたい方

lambda式は「一行で書ける短い関数」

「lambda式って何?」と聞かれたら、「1行で書ける短い関数」と僕は答えます。
この表現自体が正しいかはわかりませんが、直感的なイメージを持つにはわかりやすいと思います。

lambda式は別名「無名関数」と言われるように、通常の関数と同じ効果を持ちます。
ここで言う通常の関数というのは、「def」で定義する関数のことです。

この後、通常の関数を用いた場合とlambda式を用いた場合のコード比較をしていくので、そこで具体的なイメージを持ってもらえればと思いますが、lambda式の方が1行で書けるのでシンプルです。

両者の直感的な使いどころの違いをまとめると以下のようになります。

● 「lambda式」: 1行で書けるくらいシンプルな関数を作りたい場合

● 「通常の関数」:1行では書けないような複雑な関数を作りたい場合

lambdaの使い方①|引数を1つ受け取り計算

ここからは、通常の関数とlambda式の比較をしていきます。
まずは、「引数を1つ受け取り、その数を2乗する関数」を作ってみます。

通常の関数|引数を1つ受け取り計算

この関数に、「10」と「15」を与えてみましょう。

通常の関数 |「10」と「15」を二乗した結果

問題なく、「100」と「225」と計算出来ていますね。
lambda式を用いた場合も、当然同じ結果になる必要があります。

lambda式を用いてコーディングするためには、「lambda 変数名:処理」を指示する必要があるので、この型だけは覚えるようにしてください。これを踏まえて、受け取った値を二乗するコードをlambda式で書いたものが以下となります。

lambda式|引数を1つ受け取り計算
lambda式 |「10」と「15」を二乗した結果

このように、通常の関数と同じ結果になっていることがわかりますね。
lambda式は「型」と「使いどころ」を抑えておくことが重要だと思うので、以下3つの例も確認してイメージを膨らませていきましょう。

lambdaの使い方②|引数を2つ受け取り計算

続いては、「引数を2つ受け取り、その値を合計する関数」を作ってみます。

通常の関数|引数を2つ受け取り計算

この関数に、「10と40」と「22と77」を与えてみましょう。

通常の関数 |x1とx2を合計した結果

ここまでは通常の関数なので、特に問題ないかと思います。
では続いて、lambda式を用いて同様の結果となるようにコーディングしてみます。

lambda式|引数を2つ受け取り計算
lambda式 |x1とx2を合計した結果

こちらも、通常の関数と同様の結果が得られていることを確認してみてください。
lambda式は変数が複数の場合でも使えるので、「lambda 変数名(変数1,変数2):処理」を意識して作成してください。

lambdaの使い方③|文字列操作

これまでは計算に主眼を置いた具体例を見てきましたが、文字列操作も当然可能です。
ここでは、「小文字となっている文字列をすべて大文字にする関数」を作ってみます。

通常の関数では以下のように書くことが出来ます。

通常の関数|文字列をすべて大文字にする

この関数に、「i love python」とすべて小文字の文字列を渡してみましょう。

すべて大文字になっていることが確認出来る

結果、すべて大文字となっていることが確認出来ましたね。
同様に、lambda式を用いて書いてみます。

lambda式|文字列をすべて大文字にする
こちらもすべて大文字になっていますね

lambda式を使っても、文字列操作が出来ることがわかりました。
ちなみに、上記コード内ではlambda式の変数をxとしていますが、それ以外でも何でもOKです。
(僕はクセでこうしているだけです。)

lambdaの使い方④|活性化関数(ReLU関数)

最後は参考程度ですが、ディープラーニング(深層学習)で使われる活性化関数の一つであるReLU関数の実装も紹介しておきたいと思います。

詳細はまた別記事で紹介したいと思っていますが、ReLU関数というのは「負の値の時には0を返し、正の値の時にはその値を返す」ような関数のことを意味します。なぜ最後にこれを紹介するかと言うと、僕が個人的にlambda式の便利さに気付いたキッカケとなったのがReLU関数だったからです。

簡単に言うと、ディープラーニングの実装コードは非常に長くなるのですが、その中でも一行でシンプルにlambda式で実装出来る関数があると、可読性が上がりとても助かるといったニュアンスです。

「-10から10までの値」をReLU関数に与えることを想定したコードが以下となります。

通常の関数|ReLU関数の実装
通常の関数|ReLU関数に通した後の結果

ReLU関数を知らないという方は、「負の値がすべて0になり、正の値はその値がそのまま返されている」ことを確認してみてください。

これをlambda式で書くと以下のようになります。

lambda式|ReLu関数の実装

こちらも、通常の関数と同様の結果が得られていますね。
ちなみにReLU関数をグラフにすると、以下のようなイメージになります。参考までに。

ReLU関数のグラフ

さいごに

今回は、pythonのlambda式(無名関数)について概要と使い方を紹介してきました。

今はまだ使いどころがわからない方でも、「一行で書けるようなシンプルな関数はlambda式で書けないかな?」と考えていると、いつかはその便利さに気付くときが来ると思います(たぶんきっと)。

では今回はこのへんで。