Pythonでいろいろな関数が利用できるようになると、活用法のバリエーションも増やすことができるでしょう。今回紹介するlambdaは無名関数の一種で、正しく使用できれば関数定義の入力を簡潔にできます。作業効率を上げるためにも、lambdaの基本的な使い方をマスターしましょう。
Pythonのlambdaを理解しよう
そもそも、lambdaとはどのようなものなのでしょうか。まずはlambdaの基本的なところから見ていきましょう。
lambdaとは
lambdaは「無名関数」とも呼ばれます。これは、関数作成方法の一種です。本来は、関数を作成するためには、関数名を入力しなければなりません。しかし「無名」関数という名前の通り、関数名を入力する必要がありません。関数の指定がないので、変数に戻り値を直接返すときなどに活用されます。
defとの違い
lambdaの基本的な機能を聞くと「defと同じでは?」と思う人もいるかもしれません。defとlambdaは、もともとの性質が異なります。defはステートメントであるのに対し、lambdaは式です。もしdefを使用する場合、前もってステートメントを設定しなければなりません。一方、lambdaは式なので、簡潔に表現できるでしょう。
例えば、3の二乗を計算したかったとします。defを使用する場合、以下のようなコードを作成しなければなりません。
def square(x): result=x**2 return resulty=square(3)print(y)
一方、lambdaで記述するのであれば、以下のコードで完成です。
y = lambda x: x**2print(y(3))
defと比較して、かなりコードが簡潔になっているのが分かるでしょう。手早くコードを作成したければ、lambdaを使用するのがおすすめです。
lambdaのメリット
Pythonでlambdaを利用するメリットとして、コードが簡潔にまとめられるのは大きなメリットといえます。小さな関数をいちいち定義しなくてもいいですし、簡潔なので名前の衝突のリスクも最小限に抑制できるでしょう。
これはコードを簡潔にするための関数なので、単体で使用するものではありません。ほかの関数と組み合わせるときに使用するものです。具体的にはsortやmax、map、filterといった関数を使用する際に活用されることが多いでしょう。
lambdaの基本的な使い方について解説
lambdaを利用できれば、Pythonの関数を入力する際の作業を効率化できます。しかし、まだ慣れていないうちは手こずったり、難しく感じたりするでしょう。そこで、まずは基本的な使い方について解説します。実際に利用する際の参考にしてください。
基本的な書き方
lambdaを用いた基本的な記述方法は、「lambda 引数1,引数2…:引数を使った処理方法」です。defの場合、数行入力しなければならないところを、1行で書き換えることができるでしょう。これによって、コード入力にかかる時間を大幅に短縮できるでしょう。
例えば、3を二乗したければ、以下のようなコードを作成すれば良いでしょう。
y = lambda x: x**2print(y(3))
また、3の二乗は3×3という意味です。よって以下のようなコードを作成しても、出力結果は一緒になります。
y=lambda x,z:x*zprint(y(3,3))
いずれの場合でも、非常にシンプルなコードになります。
引数なしの場合
lambdaは引数の処理を行って、その結果を返すために使用される関数です。しかし引数なしの場合でも、以下のようなコード記述で処理は可能です。たとえば「bye」という挨拶を出力したい場合は以下のように記述します。
greeting = (lambda: 'bye')()print(greeting)
lambdaの注意点
lambdaで式を作成するにあたって、複数行にまたがった記述ができない点には注意してください。使用する際には、1行で処理内容まで書くように心がけましょう。
Pythonのコーディング規約では「lambdaを使用する場合には名前を付けない」よう推奨しています。名前を割り当てなくてもいい場合には、lambdaを使用してください。もし名前をつけたければ、defを使用するように使い分けましょう。
lambdaの活用方法を紹介
前述の通り、lambdaは単体で使用するのではなく、ほかの関数を組み合わせて活用するのが一般的です。では具体的にどのような活用方法があるのか、主要な使い方について見ていきます。
sorted文で使用する
sortedは、組み込み関数の一種です。sortした新たなリストを生成するために用いられます。
たとえば、果物をいくつかピックアップして、アルファベット順に並べ変えたい場合、sortedを用いれば以下のようなコード記述で対応できます。
l = ['apple', 'banana', 'peach', 'lemon']l_sorted_first = sorted(l)print(l_sorted_first)
これで出力すれば [‘apple’, ‘banana’, ‘lemon’,’peach’ ]という結果になるはずです。
この記述のままでもいいかもしれません。しかし、lambdaを使用すれば、特殊な処理も簡単なコード記述で処理できます。先に紹介したsortedでは、最初のアルファベットをもとにした順番に書き換えをしました。たとえば、これを2文字目のアルファベット順に並べ変えたかったとします。もしlambdaを使用すれば、以下のような簡潔な記述での処理が可能です。
l = ['apple', 'banana', 'peach', 'lemon']l_sorted_second = sorted(l, key=lambda x:x[1])print(l_sorted_second)
すると出力結果は、[‘banana’,’peach’,’lemon’,’apple’,]となるわけです。このように少し複雑な処理を進める場合にlambdaを使用すれば、簡潔なコード記述にできるでしょう。
map関数で活用する
map関数とは、複数の要素を一括処理するための関数です。このときlambdaを使用すれば、defで記述するときと比較してかなり簡略化できます。たとえばリストに書かれている名前に対して全て「さん」をつける処理をしたかったと仮定しましょう。defを使用する場合、以下のようなコードを記述します。
pre_list=['中嶋','鈴木','片山','井上']def add_func(name): result_name=name+'さん' return result_nameadd_list=list(map(add_func,pre_list))print(add_list)
すると、出力は[‘中嶋さん’,’鈴木さん’,’片山さん’,’井上さん’]となるはずです。しかし記述するにあたって、少し長文の印象があるでしょう。同じ処理をlambdaを用いた場合、以下のような記述になります。
pre_list=['中嶋','鈴木','片山','井上']add_list=list(map(lambda name:name+'さん',pre_list))print(add_list)
defを使った時と比較して、かなりシンプルなコードになっていることがわかるでしょう。ここでポイントになるのが、map関数はmapオブジェクトというデータに返す処理を施している点です。この処理をしているので、list関数を使ったリスト変換が可能になり、すっきりしたコード記述になったのです。
for文処理で使用
for文を使用するときにlambdaを活用することで、作業効率をアップできる可能性があります。for文は、とくにリストアップするときにも用いられます。たとえばお店を経営していて、いくつかの商品価格のリストを作成し、一律消費税10%をかけた金額を算出したかったと仮定しましょう。たとえば3,000円と2,000円、4,000円、1,500円の商品に一律10%の消費税をかける場合、従来は以下のような記述をします。
prices = [3000,2000,4000,1500]paymentList = []for price in prices: paymentList.append(price * 1.10)print(paymentList)
このように記述して出力すれば、[3300,2200,4400,1650]という結果になるでしょう。では、これにlambdaを用いた場合にどうなるのでしょうか。
prices = [3000,2000,4000,1500]paymentList = list(map(lambda price:price * 1.10 , prices))print(paymentList
これで、同じ出力結果になるはずです。ここでポイントになるのが、map関数が使われている点です。map関数で第一引数に1.10掛ける処理内容、コンマの後の第二引数に処理対象を記述しましょう。このようにlambdaを活用すれば、よりシンプルなコードで出力できるでしょう。
Pythonのlambdaのまとめ
Pythonでlambdaを使用できるようになれば、ここで紹介したようにコード記述を簡略化できます。特に複雑な処理をする際にlambdaを使用できるようになれば、作業効率も向上するでしょう。
最初のうちは慣れないので、難しいと感じる可能性もあります。しかし何度も繰り返し使用すれば、記述方法をマスターでき、スピーディに記述できるようになるでしょう。今までlambdaを使用してこなかったのであれば、これから意識して使ってみるのはいかがでしょうか。