無名関数のlambda式(ラムダ式)の使いどころをマスターしよう!【Python tips】

Python

独習Python [ 山田 祥寛 ]

 

こんにちは、monachan_papaです。

今回は lambda式(ラムダ式) について解説します。
lambda式とは、一時的に利用する名前を持たない使い捨ての関数(無名関数)のことです。

定義からも分かるように、普通の関数(defで定義された関数)とは違う関数です。

今回のテーマを理解することにより、lambda式は普通の関数と比べて、

  • 何が違うのか
  • メリットは何か
  • 実践的な使いどころ

こういった点が理解でき、lambda式が使いこなせるようになります。また、後述しますが、おまけとして組み込み関数を3つ同時にマスターすることが可能です。
何はともあれ、簡単な使用例をもとに始めていきましょう。

普通の関数との違い

今、「ピコ太郎」という文字列があります。このとき、この文字列の後に「★」を入れて、「ピコ太郎★」という文字列を作りたいとします。
これを普通の関数を使って書く場合、以下のようになります。

# 普通の関数
def fn(x):
    return 'ピコ太郎' + x

# 引数に★を与えて実行
fn('★')
'ピコ太郎★'

では、lambda式の場合だとどうなるか?
以下のように書きます。

# lambda式
fn = lambda x: 'ピコ太郎' + x

# 引数に★を与えて実行
fn('★')
'ピコ太郎★'

同じ結果を得ることができました。
気になるlambda式の構造ですが、以下の通りです。

lambda 引数: 戻り値となる式

メリットは何か

さきほどの例で分かるように、普通の関数は関数定義に2行必要でした。しかし、lambda式はどうでしょうか?
何と!たった1行です。

関数定義が1行で簡潔に書ける

これはどういうときに便利か?
関数の引数に関数を渡すときや、他のところで何度も使うわけではないシンプルな関数を一時的に使いたいときなどに、非常に便利です。
さきほどのコード例では、内容が単純すぎて恩恵が感じにくいので、以降で少しだけ混み入った処理を挙げて詳しくみていきます。

 


独習Python [ 山田 祥寛 ]

実践的な使いどころ

「関数の引数に関数を渡す」関数には、以下のような関数があります。

  • map関数
  • filter関数
  • sorted関数

これらは組み込み関数と呼ばれていて、import文などを使って事前準備することなく、初めからいきなり使える関数です。今から、これらをlambda式を絡めて使うことにより、実践的な使い方をマスターします。
lambda式の恩恵がよく分かるように、普通の関数で書いた場合と、lambda式で書いた場合についてすべて試します。

map関数とlambda式

map関数はリスト等のシーケンスのすべての要素に対して、指定した関数の処理を実行することができます。
第1引数に関数、第2引数にリスト等のシーケンスを指定します。ただし、注意点が一つあり、結果はmap型で返ってきますので、戻り値には適切な型変換が必要です。

map(関数, シーケンス)

まずは、テストデータに以下のリスト型の変数を用意しておきます。

ppap = ['pen', 'pineapple', 'apple']
ppap
['pen', 'pineapple', 'apple']

上記を踏まえ、リスト型変数ppap の各要素の前後に「★」を付与して、新しいリストを作るシーンを想定します。
まずは、普通の関数を使った場合です。

# 普通の関数
def fn(x):
    return f'★{x}★'

list(map(fn, ppap)) 
['★pen★', '★pineapple★', '★apple★']

続いて、lambda式を使った場合です。

# lanbda式
list(map(lambda x: f'★{x}★', ppap))
['★pen★', '★pineapple★', '★apple★']

filter関数とlambda式

filter関数はリスト等のシーケンスのすべての要素に対して、指定した関数の処理に合致した要素だけを抽出することができます。
第1引数に関数、第2引数にリスト等のシーケンスを指定します。ただし、注意点が2つあります。結果がfilter型で返ってくることと、関数には論理型を返すものを指定してあげることです。

filter(関数, シーケンス)

まずは、テストデータに以下のリスト型の変数を用意しておきます。

ppap = ['pen', 'pineapple', 'apple']
ppap
['pen', 'pineapple', 'apple']

上記を踏まえ、リスト型変数ppap の各要素で、「pen」でないものを抽出した新しいリストを作るシーンを想定します。
まずは、普通の関数を使った場合です。

# 普通の関数
def fn(x):
    return x != 'pen'

list(filter(fn, ppap))
['pineapple', 'apple']

続いて、lambda式を使った場合です。

# lambda式
list(filter(lambda x: x != 'pen', ppap))
['pineapple', 'apple']

sorted関数とlambda式

sorted関数は名前から分かるように、並び替えをするための関数です。
第1引数にシーケンス、第2引数にソートキーを関数で指定、第3引数にソートを昇順にするか降順にするか論理型で指定します。

sorted(シーケンス, key=関数, reverse=論理型)

reverse=True で降順になります。デフォルトは False で昇順となります
まずは、テストデータに以下のリスト型の変数を用意しておきます。

ppap = [(0, 'pen'), (1, 'pineapple'), (2, 'apple')]
ppap
[(0, 'pen'), (1, 'pineapple'), (2, 'apple')]

上記を踏まえ、リスト型変数ppap のタプル型になっている各要素のアルファベット側で降順 にした新しいリストを作るシーンを想定します。
まずは、普通の関数を使った場合です。

# 普通の関数
def fn(x):
    return x[1]

sorted(ppap, key=fn, reverse=True)
[(1, 'pineapple'), (0, 'pen'), (2, 'apple')]

ここで、補足です。タプル型になっている各要素のアルファベット側は、タプルのインデックス1となります。よって、x[1] と指定しているのです。
続いて、lambda式を使った場合です。

# lambda式
sorted(ppap, key=lambda x: x[1], reverse=True)
[(1, 'pineapple'), (0, 'pen'), (2, 'apple')]

 

以上で実践的な使いどころの説明はおしまいです。
今回はシンプルな例ばかりでしたが、実際にはもっと混み入った内容が出てくるかと思います。
しかし、ここで登場した基本をしっかり押さえて、とにかく実践で lambda式を何度も書く。そうすれば、いつの間にか lambda式マスターにきっとなれるはずです!

もっと、lambda式を詳しく知りたい。あるいは、map関数、filter関数、sorted関数についてもさらに知りたい、という御方は独習Python [ 山田 祥寛 ]が大変おすすめです。
プログラミングにおいて、lambda式を使うべき真の目的についても言及されており、大変興味深いです。


独習Python [ 山田 祥寛 ]

また、爆速で lambda式だけでなく Python を学びたい御方にはプログラミングスクールを考えるのも、ひとつの手です。独学よりも効果が出やすいですが、いかんせん投資がけっこうかかります。しかし、techgymというスクールは通うか通わないかは別として、無料のサンプルテキスト&解説動画がもらえます。これをとりあえず getしてまずは試しに体験学習するのもありでしょう。

コメント

タイトルとURLをコピーしました