Python 例付きのラムダ関数

⚡ スマートサマリー

ラムダ関数 Python ラムダ式は、def の代わりに lambda キーワードを使用して定義される小さな匿名関数です。単一の式を保持し、任意の数の引数を受け取り、map()、filter()、sorted() などの組み込み関数に直接渡されることがよくあります。

  • 🔑 ラムダキーワード: ラムダ式は、def、name、明示的なreturn文を持たない、lamda arguments: expression という形式で記述されます。
  • 🧮 単一の表現: 本体には値が自動的に返される式が1つだけ含まれているため、ステートメントや複数行は許可されていません。
  • 🔗 内蔵ペアリング機能: ラムダ式は、シーケンス内の項目を変換または選択するために、map()、filter()、reduce()、およびsorted()によく渡されます。
  • IIFE: ラムダは、パターン (lambda x: x + x)(2) を使用してすぐに定義および呼び出すことができ、すぐに結果を返します。
  • <XNUMXxEXNUMX><XNUMXxEXNUMX><XNUMXxXNUMXA><XNUMXxXNUMX><XNUMXxXNUMXA>️️ 対定義: 通常の関数は名前が必要で、複数のステートメントを記述できますが、ラムダ式はその機能を犠牲にして、簡潔な一行構文を実現しています。
  • 🤖 AI支援: GitHub CopilotなどのAIアシスタントは、短いプロンプトからマップ、フィルタ、ソートキー用のラムダ式を生成します。

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))

Code 説明

ここでは、ラムダ関数によって返された結果を保持する変数を定義します。

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>

ここで何が起こっているのでしょうか?さらに理解を深めるために、コードを見てみましょう。

Code 説明:

1. ここでは、 string それはラムダ式にパラメータとして渡されます。

2. 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

さて、ラムダ式が呼び出され、渡した文字列がコンソールに表示されます。しかし、この奇妙な構文は何なのでしょうか?なぜラムダ式の定義が括弧で囲まれているのでしょうか?これからその点について解説していきます。

Code 説明:

1. これは、前の例で定義したのと同じ文字列です。

2. この部分では、ラムダ式を定義し、文字列を引数として渡すことで即座に呼び出しています。これは即時実行関数式(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

Code 説明:

1. 最初の引数として別の関数を受け取り、その後に続く任意の引数を受け取る、guru という名前の関数。

2. printer_one は、渡されたパラメータを印刷して返すシンプルな関数です。

3. printer_two は printer_one と似ていますが、return 文がありません。

4. この部分では、guru 関数を呼び出し、プリンタ関数と文字列をパラメータとして渡します。

5. これは、ラムダ式を使用して第4ステップ(つまり、guru関数を呼び出す)を実現するための構文です。

次のセクションでは、ラムダ関数を使用する方法を学びます。 地図(), reduce(), フィルタ() 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]

Code 説明:

1. 最初のステートメントでは、いくつかの数値を含むシーケンスと呼ばれるリストを定義します。

2. ここでは、filter() 関数によって返されたフィルターされた値を格納する、filtered_result という変数を宣言します。

3. リストの各要素に対して実行され、値が 4 より大きい場合に true を返すラムダ関数。

4. フィルター関数によって返された結果を出力します。

map() のラムダ

map関数は、シーケンス内のすべての要素に特定の操作を適用するために使用されます。filter()関数と同様に、2つのパラメータを取ります。

  1. 要素に対して実行する操作を定義する関数
  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]

Code 説明:

1. ここでは、いくつかの数値を含むシーケンスと呼ばれるリストを定義します。

2. マップされた値を格納するfiltered_resultという変数を宣言します。

3. リストの各要素に対して実行され、その数値の二乗を返すラムダ関数。

4. map関数が返した結果を表示します。

reduce() のラムダ

map() と同様に、reduce 関数はシーケンス内のすべての要素に操作を適用するために使用されます。ただし、その動作は map とは異なります。reduce() 関数が出力を計算する手順は次のとおりです。

ステップ1) シーケンスの最初の 2 つの要素に対して定義された操作を実行します。

ステップ2) この結果を保存します。

ステップ3) 保存された結果とシーケンス内の次の要素を使用して操作を実行します。

ステップ4) 要素がなくなるまで繰り返します。

また、次の XNUMX つのパラメータも受け取ります。

  1. 実行する操作を定義する関数
  2. シーケンス (リスト、タプルなどの任意の反復子)

たとえば、リスト内のすべての要素の積を返すプログラムを次に示します。

from functools import reduce
sequences = [1,2,3,4,5]
product = reduce (lambda x, y: x*y, sequences)
print(product)

出力は次のとおりです。

120

Code 説明:

1. functoolsモジュールからreduceをインポートします。

2. ここでは、いくつかの数値を含むシーケンスと呼ばれるリストを定義します。

3. 縮小値を格納するproductという変数を宣言します。

4. リストの各要素に対して実行されるラムダ関数。前の結果に基づいて、その数値の積を返します。

5. reduce関数が返した結果を出力します。

ラムダ関数を使用する理由 (そして使用しない理由)

次のセクションで説明するように、ラムダはインタープリター レベルでは通常の関数と同じように扱われます。 ある意味、ラムダは、単一の式を返す関数を作成するためのコンパクトな構文を提供すると言えます。

しかし、ラムダ式を使うのが良い場合と避けるべき場合を知っておく必要があります。このセクションでは、 Python ラムダ式を書く際の開発者向け。

ラムダの最も一般的な使用例の 1 つは関数型プログラミングです。 Python 関数型プログラミングと呼ばれるプログラミングのパラダイム (またはスタイル) をサポートします。

ラムダ式を使うと、関数を別の関数の引数として渡すことができます(例えば、map関数やfilter関数など)。このような場合、ラムダ式を使うことで、一度限りの関数を作成し、それを引数として渡すという洗練された方法が可能になります。

Lambda を使用すべきではないのはどのような場合ですか?

実稼働環境では、複雑なラムダ関数を記述しないでください。コードを保守するコーダーがそれを解読するのは非常に困難です。複雑なワンライナー式を作成している場合は、適切な関数を定義する方がはるかに優れています。ベストプラクティスとして、単純なコードは複雑なコードよりも常に優れていることを覚えておく必要があります。

ラムダ関数と通常の関数

前述のとおり、ラムダ式は識別子がバインドされていない関数です。簡単に言うと、名前のない関数(つまり匿名関数)です。ラムダ式と通常の関数の違いを示す表を以下に示します。 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 インタープリタによって通常の関数として扱われます。

バイトコードレベルでは、2 つの定義は同じように処理されます。 Python インタプリタ。関数に名前を付けることはできません。 ラムダ それは予約されているので Pythonただし、他の関数名を使用しても同じバイトコードが生成されます。

よくあるご質問

はい。ラムダ式では、`lambda x: 'even' if x % 2 == 0 else 'odd'` のような条件式を使用できます。ただし、ラムダ式の本体は複数の文のブロックではなく単一の式でなければならないため、完全な if 文を含めることはできません。

一般的にはいいえ。PEP 8 では、関数に名前が必要な場合は def を使用することを推奨しています。ラムダ式を変数にバインドすると名前が付けられますが、より明確な意味が失われるためです。 tracdef が提供する eback です。ラムダ式は、sorted()、map()、filter() などの関数に直接渡すのが最適です。

いいえ。バイトコードレベルでは Python ラムダ式とそれと同等のdef式は同じように扱われるため、速度面での優位性はありません。ラムダ式はコード行を1行削減するだけであり、同じ処理を行う名前付き関数よりも高速に実行されるわけではありません。

はい。ラムダ式は、囲んでいるスコープから変数を読み取り、クロージャを形成できます。ループ内では注意が必要です。ラムダ式は変数自体をキャプチャしますが、その現在の値はキャプチャしません。そのため、`lambda x, n=n: x + n` のようにデフォルト引数を使用して変数を固定してください。

sorted() または list.sort() の key 引数としてラムダ式を渡します。たとえば、sorted(users, key=lambda u: u['age']) は、アイテムを年齢順に並べ替えます。ラムダ式は、 Python 各要素についてどの値を比較するかを指定することで、個別の名前付き関数を使用せずに簡潔なカスタムソートを実現します。

直接的にはできません。匿名ラムダ式には参照する名前がないからです。ラムダ式を変数に代入してその名前で呼び出すことで回避できますが、再帰処理には通常の def 関数を使用する方が明確で推奨される方法です。

ラムダ式は、AI および機械学習コードで高速なインライン変換を実現します。データサイエンティストは、ラムダ式を pandas の .apply()、map()、filter() に渡してデータをクリーンアップまたは再整形したり、特徴量をソートしたり、キー関数として使用したりします。ping 大規模なトレーニングパイプライン内で、前処理をコンパクト化する。

GitHub Copilotは、短いコメントや周囲のコードから、map()、filter()、sorted()などの関数呼び出しに必要な正しいパラメータと式を含む、完全なラムダ式を提案します。また、可読性が重要な場合には、冗長なラムダ式をより分かりやすい名前付き関数に変換することも提案します。