\r\n\r\n
Pythonのラムダは最も便利で重要で面白い機能の1つですが、残念ながら誤解や間違いが起こりやすいのも事実です。
今回は、この謎の関数について、その使い方、なぜ便利なのか、すべてを解説します。
これらの実用例を掘り下げる前に、Pythonの仮想環境を構築しておくとよいでしょう。もし、こんなことまでしたくないというのであれば、少なくともインタラクティブなオンラインのpyth***hellを使って、これらの例を試してみてください。
lambdaはPythonで関数を定義する方法の一つに過ぎません。ラムダ演算子」「ラムダ関数」と呼ばれることもある。
Pythonを使ったことがある人なら、defキーワードを使って関数を定義したことがあるでしょうし、今まではそれでうまくいっていたはずです。では、なぜ同じことをするのに別の方法があるのでしょうか?
違いは、ラムダ関数が匿名であることです。つまり、名前を付ける必要のない関数である。これらは、「本当の」関数が大きすぎる、大きすぎる場合に備えて、小さな単発の関数を作るために使われる。
ラムダは、変数に代入可能な関数オブジェクトを返します。ラムダ内で他の関数を呼び出すことはできません。
ラムダ関数の最も一般的な使用法は、シンプルな1行の関数が必要なコードで、完全な通常の関数を書くのは多すぎる。以下の記事、"Map, Filter, Reduceはどう?"。は、より詳細に説明します。
ラムダ関数を見る前に、"伝統的 "な方法で定義されたsuperbasic関数を見てみましょう。
def add_five(number): return number + 5 print(add_five(number=4))この関数は非常に基本的なものですが、ラムダを説明するために使用されています。この関数は、number 引数で渡された任意の数値に 5 を加算する。
ラムダ関数はこんな感じです。
add_five = lambda number: number + 5 print(add_five(number=4))defの代わりにlambdaを使用すると、括弧は不要ですが、lambdaキーワードに続く単語はすべて引数として作成されます。引数と式を分けるにはコロンが使われる。この例では、式は数字+5である。
returnキーワードを使う必要はなく、lambdaが自動的に行ってくれる。
ここでは、2つのパラメータを持つラムダ関数を作成する方法を説明します。
add_numbers_and_five = lambda number1, number2: number1 + number2 + 5 print(add_numbers_and_five(number1=4, number2=3))Lambdasの見解がまだよくわからないという方は、次のセクションでさらに深く掘り下げ、光を見ることができるようになります。
Pythonのコアライブラリには、map、reduce、filterの3つのメソッドがあります。これらがラムダ関数を使う一番の理由でしょう。
map関数は、関数とリストの2つの引数を取ります。関数を受け取り、それをリストの各要素に適用し、変更後のリストをマップオブジェクトとして返します。結果としてのマップオブジェクトを再びリストに戻すには、リスト関数を使用します。
以下は、ラムダを使用しないmapの使用方法です。
list1 = [2, 4, 6, 8]print(list1)def add_five(number): return number + 5 new_list = list(map(add_five, list1))print(new_list)このmap関数はとても便利なのですが、おそらくもっといい方法があります。addocu 5関数は引数として渡されますが、mapを使うたびに関数を作りたくない場合はどうすればいいでしょうか。代わりにlambdaを使うことができます
以下は、関数がラムダに置き換わったことを除けば、同じコードのようなものです。
list1 = [2, 4, 6, 8]print(list1) new_list = list(map(lambda x: x + 5, list1))print(new_list)ご覧のように、addu five関数全体はもはや必要ありません。その代わりに、ラムダ関数が使われて、物事が整理されています。
filterは関数を受け取り、それをリストの各要素に適用し、関数がTrueを返す要素だけを含む新しいリストを作成します。
まず、ラムダがない。
numbers = [1, 4, 5, 10, 20, 30]print(numbers)def greater_than_ten_func(number): if number > 10: return True else: return Falsenew_numbers = list(filter(greater_than_ten_func, numbers)) print(new_numbers)このコードでもいいのだが、ちょっと長い。lambdaが何行削除できるか見てみよう。
numbers = [1, 4, 5, 10, 20, 30]print(numbers)new_numbers = list(filter(lambda x: x > 10, numbers))print(new_numbers)ラムダ関数が、10個以上の関数の必要性を置き換えてくれたのですそれは、シンプルな5つの言葉で実現されています。ラムダが強力なのはこの点で、単純なタスクの雑念を減らしてくれるのです。
最後に、reduceについて見てみましょう。reduceはPythonのもう一つのクールな関数です。リスト内の全項目にローリング計算を適用します。合計を計算したり、すべての数値を掛け合わせるために使うことができます:。
from functools import reducenumbers = [10, 20, 30, 40]print(numbers)def summer(a, b): return a + b result = reduce(summer, numbers)print(result)この例では、functoolsモジュールからreduceをインポートする必要がありますが、functoolsモジュールはPythonのコアライブラリの一部ですのでご安心ください。
関数を必要としない点では、lambdaと非常によく似ています。
from functools import reducenumbers = [10, 20, 30, 40]print(numbers) result = reduce(lambda a, b: a + b, numbers)print(result)これらの例は、ラムダ関数とPythonのコアライブラリのmap、filter、reduceをいかに簡単に使えるかを示しています。とはいえ、ラムダ関数の使い道はある。
基本的な作業以上のことをする場合、あるいは他のメソッドを呼び出す場合は、通常の関数を使用します。lambdaは単発の匿名関数に最適ですが、式は1つだけでなければなりません。もし、ラムダが正規表現のように見えてきたら、専用のメソッドにリファクタリングする時期が来ているかもしれません。
より詳しい情報は、Pythonオブジェクト指向プログラミングガイドとPython for Beginners FAQガイドをご覧ください。