Pythonにはlambda(ラムダと読みます)式という書き方があり、場面に応じて活用することで、とても便利な手法となります。
この記事では、
- lambda(ラムダ)式とは
- lambda(ラムダ)式の使い方
- lambda(ラムダ)式でfor文処理を実装する方法
- lambda(ラムダ)式でif文処理を実装する方法
などの基本的な内容から、応用的な使い方に関しても解説していきます。
lambda(ラムダ)式について正しく理解し、必要な場面で使いこなすことができるように、わかりやすく解説します!
※ この記事のコードはPython 3.7, Ubuntu 18.04で動作確認しました。
本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。
→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説
なお、その他のPythonの記事についてはこちらにまとめています。
lambda式とは
そもそもlambda(ラムダ)という用語について、プログラミング初学者には馴染みがあまりないかもしれません。
lambdaについて簡潔にその用語の意義とメリットをお伝えしますと以下の通りとなります。lambda式とは、関数に名前を付けずに定義するものです。
これだけではなんとなくわかったようなわからないようなという感じかと思います。
そこで、さらに具体的なサンプルを用いてlambda式を理解できるように解説します。
lambda式の基本的な書き方
商品の価格と消費税(8%)を入れて支払い代金を計算する処理を実装するとします。
#lambda式を使わずに通常の関数を用いる場合 def func(price,tax): return price + (price * tax) payment1 = func(100,0.08) print(payment1) #lambda式を用いる場合 print((lambda price,tax:price + (price * tax))(100,0.08))
実行結果
108.0 108.0
lambda式を使用しない場合、まず価格と消費税を掛け合わせて支払い代金を計算する関数(func)を定義しています。
その後、関数(func)の引数に実際の値(100,0.08)を設定し、その結果を変数(payment1)に格納しています。
一方、lambda式を用いる場合は、defによる関数定義は登場せず、代わりにlambdaと書いて、その横に引数そして、セミコロン(:)の後に引数を使用した処理内容という形式にて書くことができます。
#lambda式の形式 lambda 引数:処理内容
まずはこの基本的な書き方を覚えてください。
引数なしのlambda式の書き方
lambda式では引数を与えられて、その引数を使い処理を行い、その結果を返すことが基本です。
ですが、引数なしの処理も以下のように書くことはできます。
#引数なしのlambda式 greeting = (lambda: 'hello')() print(greeting)
実行結果
hello
ここではわかりやすさを優先してlambda式を変数に代入しました。
PEP8というPythonのコーディング規約によると、「名前を付ける場合はdefを使い、lambdaを使う場合は名前を付けない」を推奨しています。
PEP8に沿ってコーディングすると読みやすいコードが書けるので、特段理由がないのならばlambda式を使うときは名前を割り当てない方がいいですね。
(名前を割り当てる必要がないところでlambda式を使おう!ということです。)
ちなみに、有志によって和訳されたPEP8が公開されているので、ぜひ読んでみてください。
lambda式の実践的な使い方
基本的な書き方を確認したところで、次はより実践的な使い方を学んでいきましょう。
lambda式でfor文処理を実装する方法
例えば、様々な商品の価格を抜き出したリストがあり、そのリスト対して、消費税を上乗せした価格情報を取得する処理を実装するとします。
その場合、商品価格のリストをfor文を使用して以下のように実装することができます。
prices = [3000,2500,10500,4300] paymentList = [] for price in prices: paymentList.append(price * 1.08) print(paymentList)
実行結果
[3240.0, 2700.0, 11340.0, 4644.0]
同じ処理内容を今度はlambda式を利用して実装します。その際に、合わせて利用する関数がmap関数です。
map関数は第一引数に処理内容、第二引数に処理対象のリストを指定します。
prices = [3000,2500,10500,4300] paymentList = list(map(lambda price:price * 1.08 , prices)) print(paymentList)
実行結果
[3240.0, 2700.0, 11340.0, 4644.0]
このようにlambda式とmap関数を併用することで、for文の処理を実装することが可能です。
lambda式でif文処理を実装する方法
次にfor文でリストの要素を一つ一つ処理する際に、if文の条件が入るケースについてもlambda式を活用できます。
同じく例として様々な商品の価格を抜き出したリストがあり、そのリストからある金額以上のものを抜き出し、価格の安い順に並べた情報を取得するプログラムを実装するとします。
こちらもまずはlambda式を用いない場合の実装方法の例をみていただきましょう。
prices = [3000,2500,10500,4300] paymentList = [] for price in prices: if price > 3500: paymentList.append(price) paymentList.sort() print(paymentList)
実行結果
[4300, 10500]
これをlambda式を用いて書くと以下のようになります。
prices = [3000,2500,10500,4300] priceList = list(filter(lambda price:price > 3500, prices)) priceList.sort() print(priceList)
実行結果
[4300, 10500]
上記サンプルにてlambda式と合わせてlist関数とfilter関数を使用しました。list関数は引数の値をlist型へ変換し、その後、sort()関数にて並び替えを行うために使用しています。
そして、filter関数は第二引数に指定された配列の各要素に対して、第一引数の関数処理を実施し、Trueとなるものだけを抽出する処理を行なっています。
これまで見ていただいたmap関数とfilter関数と合わせて活用したlambda式は、特に無名関数と呼ばれる使い方となります。
下記の通り名前がある関数(checkPrice)を使用した処理とは対照的にlambda式では関数名を定義せずに使用することができることから無名関数と呼ばれています。
def checkPrice(price): return price > 3500 prices = [3000,2500,10500,4300] priceList = list(filter(checkPrice, prices)) priceList.sort() print(priceList)
実行結果
[4300, 10500]
まとめ
ここでは、lambda式について、基本的な使い方から応用的な具体例についても紹介しました。
様々な箇所で共通的に使用したい処理内容であれば、通常のdefを用いた関数を活用し、使用範囲が限られる処理内容であれば、lambda式を用いて簡潔に読みやすいコードを書く事を優先することを今後は検討してみて下さい。
もし、lambda式の使い方を忘れてしまったら、この記事を思い出してくださいね!