例を含む Python Lambda 関数
Python の Lambda 関数とは?
Python の Lambda 関数 プログラミングは無名関数または名前のない関数です。これは、1 行しか持たない小さく制限された関数です。通常の関数と同様に、Lambda 関数は 1 つの式で複数の引数を持つことができます。
Python では、ラムダ式 (またはラムダ形式) を使用して無名関数を作成します。そのためには、 ラムダ を使用します キーワード ( def を使用するのと同じように) 通常の機能を定義します)。 Python で定義するすべての無名関数には、次の 3 つの重要な部分があります:
- ラムダ キーワード。
- パラメータ (またはバインドされた変数)、および
- 関数本体。
ラムダ関数には任意の数のパラメーターを含めることができますが、関数本体には 1 しか含めることができません 表現。さらに、ラムダは 1 行のコードで記述され、すぐに呼び出すこともできます。今後の例で、これらすべての動作を確認できます。
この Lambda in Python チュートリアルでは、次のことを学びます:
- 構文と例
- Python 組み込みでラムダを使用する
- filter() のラムダ
- map() のラムダ
- reduce() のラムダ
- ラムダ関数を使用する理由 (および使用しない理由) は?
- ラムダと通常の関数
構文と例
ラムダ関数を記述するための正式な構文は次のとおりです:
lambda p1, p2: expression
ここで、p1 と p2 は、ラムダ関数に渡されるパラメーターです。パラメータは必要な数だけ追加できます。
ただし、通常の関数のように、パラメーターを括弧で囲んでいないことに注意してください。最後の部分 (式) は、関数に提供するパラメーターで動作する任意の有効な Python 式です。
例 1
ラムダについて理解できたので、例を使って試してみましょう。したがって、IDLE を開き、次のように入力してください:
adder = lambda x, y: x + y print (adder (1, 2))
出力は次のとおりです:
3
コードの説明
ここでは、ラムダ関数によって返される結果を保持する変数を定義します。
1. 無名関数を定義するために使用されるラムダ キーワード。
2. x と y は、ラムダ関数に渡すパラメーターです。
3. これは、渡した 2 つのパラメーターを追加する関数の本体です。単一の式であることに注意してください。ラムダ関数の本体に複数のステートメントを記述することはできません。
4. 関数を呼び出して、戻り値を出力します。
例 2
これは、ラムダの基本と構文を理解するための基本的な例でした。ラムダを出力して結果を見てみましょう。再び IDLE を開いて、次のように入力します。
#What a lambda returns string='some kind of a useless lambda' print(lambda string : print(string))
ファイルを保存し、F5 キーを押してプログラムを実行します。これが得られるはずの出力です。
出力:
<function <lambda> at 0x00000185C3BF81E0>
ここで何が起こっているのですか?さらに理解するためにコードを見てみましょう。
コードの説明
<オール>しかし、プログラムが渡した文字列を出力しないのはなぜでしょうか?これは、ラムダ自体が関数オブジェクトを返すためです。この例では、ラムダは呼び出されていません 印刷機能によって、しかし単に戻る 関数オブジェクトとそれが格納されているメモリ位置。それがコンソールに表示されます。
例 3
ただし、次のようなプログラムを作成すると:
#What a lambda returns #2 x="some kind of a useless lambda" (lambda x : print(x))(x)
F5 キーを押して実行すると、次のような出力が表示されます。
出力:
some kind of a useless lambda
これで、ラムダが呼び出され、渡した文字列がコンソールに出力されます。しかし、その奇妙な構文は何ですか? また、ラムダ定義が括弧で囲まれているのはなぜですか?それを理解しましょう。
コードの説明
<オール>例 4
ラムダ関数と通常の関数がどのように実行されるかを理解するために、最後の例を見てみましょう。したがって、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 キーを押してプログラムを実行します。間違いがなければ、出力は次のようになります。
出力:
プリンター 1 定期呼び出し
プリンター 2 定期呼び出し
プリンター 1 ラムダ呼び出し
プリンター 2 ラムダ呼び出し
コードの説明
<オール>
次のセクションでは、map()、 でラムダ関数を使用する方法を学びます。 reduce(), および filter()
Python 組み込みでラムダを使用する
Lambda 関数は、Python の組み込みメソッドを使用して操作を実行するための洗練された強力な方法を提供します。これが可能なのは、ラムダをすぐに呼び出して、これらの関数に引数として渡すことができるためです。
Python Lambda の IIFE
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. 最初のステートメントでは、いくつかの数値を含む sequence というリストを定義します。
2. ここで、filter() 関数によって返されたフィルタリングされた値を格納する、filtered_result という変数を宣言します。
3. リストの各要素に対して実行され、4 より大きい場合に true を返すラムダ関数。
<強い>4. フィルター関数によって返された結果を出力します。
map() のラムダ
map 関数は、シーケンス内のすべての要素に特定の操作を適用するために使用されます。 filter() と同様に、2 つのパラメーターも必要です:
<オール>たとえば、指定されたリストの数字の 2 乗を出力するプログラムは次のとおりです:
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]
コードの説明:
<オール>reduce() のラムダ
map() のような reduce 関数は、シーケンス内のすべての要素に操作を適用するために使用されます。ただし、その動作はマップとは異なります。出力を計算するための reduce() 関数の手順は次のとおりです。
ステップ 1) シーケンスの最初の 2 つの要素に対して定義された操作を実行します。
ステップ 2) この結果を保存
ステップ 3) 保存された結果とシーケンス内の次の要素を使用して操作を実行します。
ステップ 4) 要素がなくなるまで繰り返します。
また、次の 2 つのパラメーターも必要です:
<オール>たとえば、リスト内のすべての要素の積を返すプログラムは次のとおりです:
from functools import reduce sequences = [1,2,3,4,5] product = reduce (lambda x, y: x*y, sequences) print(product)
出力は次のとおりです:
120
コードの説明:
<オール>ラムダ関数を使用する理由 (および使用しない理由) は?
次のセクションで説明するように、ラムダはインタープリター レベルでは通常の関数と同じように扱われます。ある意味では、ラムダは、単一の式を返す関数を記述するためのコンパクトな構文を提供すると言えます。
ただし、いつラムダを使用するのが良い考えで、いつラムダを避けるべきかを知っておく必要があります。このセクションでは、ラムダを記述するときに Python 開発者が使用する設計原則のいくつかを学びます。
Python は関数型プログラミングとして知られるプログラミングのパラダイム (またはスタイル) をサポートしているため、ラムダの最も一般的な使用例の 1 つは関数型プログラミングです。
関数をパラメーターとして別の関数に提供できます (たとえば、マップ、フィルターなど)。このような場合、ラムダを使用すると、1 回限りの関数を作成してパラメーターとして渡す洗練された方法が提供されます。
Lambda を使用してはいけない場合
実稼働環境で複雑なラムダ関数を記述しないでください。コードを管理しているコーダーが解読するのは非常に困難です。複雑なワンライナー式を作成している場合は、適切な関数を定義することをお勧めします。ベスト プラクティスとして、単純なコードは常に複雑なコードよりも優れていることを覚えておく必要があります。
ラムダと通常の関数
前述のように、ラムダは [vV4][J5] バインドされた識別子を持たない単なる関数です。簡単に言えば、それらは名前のない関数です (したがって、匿名)。 Python のラムダ関数と通常の関数の違いを示す表を次に示します。
ラムダ
通常の機能
構文:
lambda x : x + x
構文:
def (x) : return x + x
ラムダ関数は、本体に式を 1 つしか持つことができません。
通常の関数は、本体に複数の式とステートメントを含めることができます。
ラムダには名前が関連付けられていません。そのため、匿名関数とも呼ばれます。
通常の関数には名前と署名が必要です。
本文は自動的に返されるため、ラムダには return ステートメントは含まれません。
値を返す必要がある関数には、return ステートメントを含める必要があります。
違いの説明?
ラムダ関数と通常の関数の主な違いは、ラムダ関数は単一の式のみを評価し、関数オブジェクトを生成することです。したがって、前の例で行ったように、ラムダ関数の結果に名前を付けてプログラムで使用できます。
上記の例の通常の関数は次のようになります:
def adder (x, y): return x + y print (adder (1, 2))
ここで、名前を定義する必要があります 返す関数について 呼び出しの結果 それ。ラムダ関数には、デフォルトで常に返される式が 1 つしかないため、return ステートメントは含まれません。ラムダはすぐに呼び出すことができるため、ラムダを割り当てる必要さえありません (次のセクションを参照してください)。次の例でわかるように、ラムダは、Python の組み込み関数で使用すると特に強力になります。
ただし、ラムダが単一の式 (上記のような) を返す関数とどのように異なるのか疑問に思われるかもしれません。通訳者レベルでは、大きな違いはありません。意外に聞こえるかもしれませんが、Python で定義したラムダ関数は、インタープリターによって通常の関数として扱われます。
図でわかるように、2 つの定義は、バイトコードに変換されるときに Python インタープリターによって同じ方法で処理されます。現在、関数に lambda という名前を付けることはできません これは Python によって予約されているためですが、他の関数名は同じバイトコードを生成します [KR6]。
まとめ
- 匿名関数とも呼ばれるラムダは、名前 (つまり、識別子) を必要としない小さな制限付き関数です。
- Python のすべてのラムダ関数には、3 つの重要な部分があります:
- ラムダ キーワード。
- パラメータ (またはバインドされた変数)、および
- 関数本体。
- ラムダを記述するための構文は次のとおりです:ラムダ パラメータ:式
- ラムダは任意の数のパラメータを持つことができますが、中括弧で囲まれていません
- ラムダの関数本体には、デフォルトで返される式を 1 つだけ含めることができます。
- バイトコード レベルでは、インタープリターによるラムダ関数と通常の関数の処理方法に大きな違いはありません。
- ラムダは次の構文で IIFE をサポートします:(ラムダ パラメータ:式)(引数)
- ラムダは、一般的に次の Python 組み込みで使用されます:
- フィルター:フィルター (ラムダ パラメーター:式、イテラブル シーケンス)
- マップ:マップ (ラムダ パラメータ:式、イテラブル シーケンス)
- Reduce:reduce (ラムダ パラメータ 1、パラメータ 2:式、イテラブル シーケンス)
- 複雑なラムダ関数を本番環境で記述しないでください。コード管理者にとって困難になるためです。
[J5]表を追加しましたが、違いを理解するには説明が必要です。
Python