Python 例付きのラムダ関数
Lambda関数とは Python?
A ラムダ関数 Python プログラミングは、匿名関数または名前のない関数です。 これは XNUMX 行しかない小規模で制限された関数です。 通常の関数と同様に、Lambda 関数は XNUMX つの式で複数の引数を持つことができます。
In Pythonラムダ式(またはラムダフォーム)は、匿名関数を作成するために利用されます。そのためには、 ラムダ キーワード(あなたが使うのと同じように) def 通常の関数を定義するために定義する。 Python 3つの重要な部分があります:
- ラムダキーワード。
- パラメーター (またはバインドされた変数)、および
- 関数本体。
ラムダ関数には任意の数のパラメータを含めることができますが、関数本体にはパラメータのみを含めることができます。 XNUMXつ 表現。 さらに、ラムダは XNUMX 行のコードで記述され、すぐに呼び出すこともできます。 これらすべてが実際に動作する様子を、次の例で見ていきます。
構文と例
ラムダ関数を記述するための正式な構文は次のとおりです。
lambda p1, p2: expression
ここで、p1 と p2 はラムダ関数に渡されるパラメーターです。 必要な数のパラメータを追加することも、少数のパラメータを追加することもできます。
ただし、通常の関数のようにパラメータを括弧で囲まないことに注意してください。最後の部分 (式) は、関数に指定したパラメータを操作する有効な Python 式です。
例
ラムダについて理解したところで、例を使って試してみましょう。 それで、あなたの IDLE 次のように入力します。
adder = lambda x, y: x + y print (adder (1, 2))
出力は次のとおりです。
3
コードの説明
ここでは、ラムダ関数によって返された結果を保持する変数を定義します。
1. 匿名関数を定義するために使用される lambda キーワード。
2. x と y はラムダ関数に渡すパラメーターです。
3. これは関数の本体で、渡した 2 つのパラメーターを追加します。 これは単一の式であることに注意してください。 ラムダ関数の本体に複数のステートメントを記述することはできません。
4. 関数を呼び出して、戻り値を出力します。
例
これは、ラムダの基礎と構文を理解するための基本的な例でした。 ラムダを出力して結果を見てみましょう。 もう一度、 IDLE 次のように入力します。
#What a lambda returns string='some kind of a useless lambda' print(lambda string : print(string))
ファイルを保存し、F5 キーを押してプログラムを実行します。 これが得られる出力です。
出力:
<function <lambda> at 0x00000185C3BF81E0>
ここで何が起こっているのでしょうか? さらに理解するためにコードを見てみましょう。
コードの説明
- ここで、 string これをパラメータとしてラムダに渡します。
- print ステートメントを呼び出して結果を出力するラムダを宣言します。
しかし、なぜプログラムは渡した文字列を出力しないのでしょうか? これは、ラムダ自体が関数オブジェクトを返すためです。 この例では、ラムダは実行されていません。 呼ばれます 印刷機能を使用して簡単に 返す 関数オブジェクトとそれが保存されているメモリの場所。 それがコンソールに出力されます。
例
ただし、次のようなプログラムを作成すると、次のようになります。
#What a lambda returns #2 x="some kind of a useless lambda" (lambda x : print(x))(x)
F5 キーを押して実行すると、次のような出力が表示されます。
出力:
some kind of a useless lambda
ここで、ラムダが呼び出され、渡した文字列がコンソールに表示されます。しかし、この奇妙な構文とは何でしょうか。また、ラムダの定義が括弧で囲まれているのはなぜでしょうか。今から理解しましょう。
コードの説明
- これは、前の例で定義したのと同じ文字列です。
- この部分では、ラムダを定義し、文字列を引数として渡すことですぐに呼び出します。 これは IIFE と呼ばれるもので、このチュートリアルの次のセクションで詳細を学習します。
例
ラムダと通常の関数がどのように実行されるかを理解するために最後の例を見てみましょう。 それで、あなたの IDLE 新しいファイルに次のように入力します。
#A REGULAR FUNCTION def guru( funct, *args ): funct( *args ) def printer_one( arg ): return print (arg) def printer_two( arg ): print(arg) #CALL A REGULAR FUNCTION guru( printer_one, 'printer 1 REGULAR CALL' ) guru( printer_two, 'printer 2 REGULAR CALL \n' ) #CALL A REGULAR FUNCTION THRU A LAMBDA guru(lambda: printer_one('printer 1 LAMBDA CALL')) guru(lambda: printer_two('printer 2 LAMBDA CALL'))
次に、ファイルを保存し、F5 キーを押してプログラムを実行します。 何も間違えていなければ、出力は次のようになります。
出力:
printer 1 REGULAR CALL printer 2 REGULAR CALL printer 1 LAMBDA CALL printer 2 LAMBDA CALL
コードの説明
- 最初のパラメータとして別の関数を受け取り、その後に他の引数を受け取る guru と呼ばれる関数。
- printer_one は、渡されたパラメータを出力して返す単純な関数です。
- printer_two は printer_one に似ていますが、return ステートメントがありません。
- この部分では、guru 関数を呼び出し、プリンター関数と文字列をパラメーターとして渡します。
- これは、ラムダを使用して XNUMX 番目のステップ (つまり、guru 関数の呼び出し) を実現するための構文です。
次のセクションでは、ラムダ関数を使用する方法を学びます。 地図()、 減らす()、 と フィルタ() in Python.
ラムダ式の使用 Python ビルトイン
ラムダ関数は、組み込みメソッドを使用して操作を実行するためのエレガントで強力な方法を提供します。 Pythonラムダをすぐに呼び出して、これらの関数に引数として渡すことができるため、これが可能になります。
IIFEで Python ラムダ
IIFE の略 すぐに呼び出される関数の実行。 これは、ラムダ関数が定義されるとすぐに呼び出すことができることを意味します。 これを例で理解してみましょう。 あなたを燃え上がらせてください IDLE 次のように入力します。
(lambda x: x + x)(2)
出力とコードの説明は次のとおりです。
ラムダのこの機能により、すぐに呼び出すことができ、map() やreduce() などの関数内でラムダを使用できるようになります。 これらの機能を再度使用したくない場合に便利です。
filter() のラムダ
フィルター関数は、一連の要素からいくつかの特定の要素を選択するために使用されます。 シーケンスには、リスト、セット、タプルなどの任意の反復子を指定できます。
選択される要素は、事前に定義された制約に基づいています。 2 つのパラメータを取ります。
- フィルタリング制約を定義する関数
- シーケンス (リスト、タプルなどの任意の反復子)
たとえば、
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = filter (lambda x: x > 4, sequences) print(list(filtered_result))
出力は次のとおりです。
[10, 8, 7, 5, 11]
コードの説明:
1. 最初のステートメントでは、いくつかの数値を含むシーケンスと呼ばれるリストを定義します。
2. ここでは、filter() 関数によって返されたフィルターされた値を格納する、filtered_result という変数を宣言します。
3. リストの各要素に対して実行され、値が 4 より大きい場合に true を返すラムダ関数。
4. フィルター関数によって返された結果を出力します。
map() のラムダ
map 関数は、シーケンス内のすべての要素に特定の操作を適用するために使用されます。filter() と同様に、2 つのパラメータを取ります。
- 要素に対して実行する操作を定義する関数
- XNUMX つ以上のシーケンス
たとえば、指定されたリスト内の数字の平方を出力するプログラムは次のとおりです。
sequences = [10,2,8,7,5,4,3,11,0, 1] filtered_result = map (lambda x: x*x, sequences) print(list(filtered_result))
出力:
[100, 4, 64, 49, 25, 16, 9, 121, 0, 1]
【KR1】
コードの説明:
- ここでは、いくつかの数値を含むシーケンスと呼ばれるリストを定義します。
- マップされた値を格納する filtered_result という変数を宣言します。
- リストの各要素に対して実行され、その数値の XNUMX 乗を返すラムダ関数。
- マップ関数によって返された結果を出力します。
reduce() のラムダ
map() と同様に、reduce 関数はシーケンス内のすべての要素に操作を適用するために使用されます。ただし、その動作は map とは異なります。reduce() 関数が出力を計算する手順は次のとおりです。
ステップ1) シーケンスの最初の 2 つの要素に対して定義された操作を実行します。
ステップ2) この結果を保存する
ステップ3) 保存された結果とシーケンス内の次の要素を使用して操作を実行します。
ステップ4) 要素がなくなるまで繰り返します。
また、次の XNUMX つのパラメータも受け取ります。
- 実行する操作を定義する関数
- シーケンス (リスト、タプルなどの任意の反復子)
たとえば、リスト内のすべての要素の積を返すプログラムを次に示します。
from functools import reduce sequences = [1,2,3,4,5] product = reduce (lambda x, y: x*y, sequences) print(product)
出力は次のとおりです。
120
コードの説明:
- functoolsモジュールからreduceをインポートします
- ここでは、いくつかの数値を含むシーケンスと呼ばれるリストを定義します。
- 削減された値を格納する product という変数を宣言します。
- リストの各要素に対して実行されるラムダ関数。 前の結果に従って、その数値の積が返されます。
- reduce 関数によって返された結果を出力します。
ラムダ関数を使用する理由 (そして使用しない理由)
次のセクションで説明するように、ラムダはインタープリター レベルでは通常の関数と同じように扱われます。 ある意味、ラムダは、単一の式を返す関数を作成するためのコンパクトな構文を提供すると言えます。
ただし、ラムダを使用するのが適切な場合とラムダを避けるべき場合を知っておく必要があります。 このセクションでは、Python 開発者がラムダを作成するときに使用する設計原則のいくつかを学びます。
ラムダの最も一般的な使用例の1つは関数型プログラミングです。 Python 関数型プログラミングと呼ばれるプログラミングのパラダイム (またはスタイル) をサポートします。
これにより、関数を別の関数 (マップ、フィルターなど) のパラメーターとして提供できます。 このような場合、ラムダを使用すると、ワンタイム関数を作成し、それをパラメーターとして渡すためのエレガントな方法が提供されます。
Lambda を使用すべきではないのはどのような場合ですか?
実稼働環境では、複雑なラムダ関数を記述しないでください。コードを保守するコーダーがそれを解読するのは非常に困難です。複雑なワンライナー式を作成している場合は、適切な関数を定義する方がはるかに優れています。ベストプラクティスとして、単純なコードは複雑なコードよりも常に優れていることを覚えておく必要があります。
ラムダ関数と通常の関数
前に述べたように、ラムダは、バインドされた識別子を持たない単なる関数です[vV4][J5]。 簡単に言うと、これらは名前のない関数です (したがって匿名です)。 以下に、ラムダと Python の通常の関数の違いを示す表を示します。
ラムダ
通常の関数
構文:
lambda x : x + x
構文:
def (x) : return x + x
Lambda 関数の本体には式を XNUMX つだけ含めることができます。
正規関数は、その本体に複数の式やステートメントを含めることができます。
ラムダには名前が関連付けられていません。 そのため、これらは匿名関数とも呼ばれます。
通常の関数には名前と署名が必要です。
本体が自動的に返されるため、ラムダには return ステートメントは含まれません。
値を返す必要がある関数には return ステートメントを含める必要があります。
違いの説明は?
ラムダ関数と通常の関数の主な違いは、ラムダ関数は XNUMX つの式のみを評価し、関数オブジェクトを生成することです。 したがって、前の例で行ったように、ラムダ関数の結果に名前を付けてプログラムで使用できます。
上記の例の通常の関数は次のようになります。
def adder (x, y): return x + y print (adder (1, 2))
ここで、を定義する必要があります。 名 関数の場合 収益 私たちがしたときの結果 コール ラムダ関数には、デフォルトで常に返される単一の式のみが含まれるため、return文は含まれません。ラムダはすぐに呼び出すことができるため、割り当てる必要もありません(次のセクションを参照)。次の例でわかるように、ラムダは、 Pythonの組み込み関数。
しかし、ラムダ式が(上記のような)単一の式を返す関数とどう違うのか疑問に思うかもしれません。インタープリタレベルでは、大きな違いはありません。驚くかもしれませんが、 Python インタープリタによって通常の関数として扱われます。
図からわかるように、XNUMX つの定義は、バイトコードに変換されると、Python インタプリタによって同じ方法で処理されます。 現在、関数に名前を付けることはできません ラムダ それは予約されているので Pythonただし、他の関数名でも同じバイトコードが生成されます[KR6]。
まとめ
- 匿名関数としても知られるラムダは、名前 (つまり、識別子) を必要としない、小さく制限された関数です。
- すべてのラムダ関数 Python 3つの重要な部分があります:
- ラムダキーワード。
- パラメーター (またはバインドされた変数)、および
- 関数本体。
- ラムダを記述するための構文は次のとおりです: ラムダ パラメータ: 式
- ラムダには任意の数のパラメータを含めることができますが、パラメータは中かっこで囲まれていません
- ラムダの関数本体には式を 1 つだけ含めることができ、デフォルトで返されます。
- バイトコード レベルでは、インタープリターによるラムダ関数と通常の関数の処理方法に大きな違いはありません。
- ラムダは、次の構文を通じて IIFE をサポートします: (ラムダ パラメータ: 式)(引数)
- ラムダは、次の Python 組み込み関数でよく使用されます。
- フィルター: フィルター (ラムダパラメーター: 式、反復可能シーケンス)
- マップ: マップ (ラムダパラメータ: 式、反復可能シーケンス)
- Reduce:reduce(ラムダパラメータ1、パラメータ2:式、反復可能シーケンス)
- コード管理者にとっては困難になるため、運用環境では複雑なラムダ関数を作成しないでください。
[J5]表を追加しましたが、違いを理解するには説明が必要です。