工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Python

例を含む Python Lambda 関数

Python の Lambda 関数とは?

Python の Lambda 関数 プログラミングは無名関数または名前のない関数です。これは、1 行しか持たない小さく制限された関数です。通常の関数と同様に、Lambda 関数は 1 つの式で複数の引数を持つことができます。

Python では、ラムダ式 (またはラムダ形式) を使用して無名関数を作成します。そのためには、 ラムダ を使用します キーワード ( def を使用するのと同じように) 通常の機能を定義します)。 Python で定義するすべての無名関数には、次の 3 つの重要な部分があります:

ラムダ関数には任意の数のパラメーターを含めることができますが、関数本体には 1 しか含めることができません 表現。さらに、ラムダは 1 行のコードで記述され、すぐに呼び出すこともできます。今後の例で、これらすべての動作を確認できます。

この Lambda in Python チュートリアルでは、次のことを学びます:

構文と例

ラムダ関数を記述するための正式な構文は次のとおりです:

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>

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

コードの説明

<オール>
  • ここでは、パラメータとしてラムダに渡す文字列を定義します。
  • print ステートメントを呼び出して結果を出力するラムダを宣言します。
  • しかし、プログラムが渡した文字列を出力しないのはなぜでしょうか?これは、ラムダ自体が関数オブジェクトを返すためです。この例では、ラムダは呼び出されていません 印刷機能によって、しかし単に戻る 関数オブジェクトとそれが格納されているメモリ位置。それがコンソールに表示されます。

    例 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

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

    コードの説明

    <オール>
  • 前の例で定義したのと同じ文字列です。
  • この部分では、ラムダを定義し、文字列を引数として渡すことですぐに呼び出します。これは IIFE と呼ばれるもので、このチュートリアルの次のセクションで詳しく説明します。
  • 例 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 ラムダ呼び出し

    コードの説明

    <オール>
  • 最初のパラメータとして別の関数を受け取り、それに続くその他の引数を取る guru と呼ばれる関数。
  • printer_one は、渡されたパラメータを出力して返す単純な関数です。
  • printer_two は printer_one に似ていますが、return ステートメントがありません。
  • この部分では、guru 関数を呼び出し、プリンター関数と文字列をパラメーターとして渡します。
  • これは 4 番目のステップ (つまり、guru 関数の呼び出し) を達成するための構文ですが、ラムダを使用しています。
  • 次のセクションでは、ma​​p()、 でラムダ関数を使用する方法を学びます。 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 つのパラメーターも必要です:

    <オール>
  • 要素に対して実行する op を定義する関数
  • 1 つまたは複数のシーケンス
  • たとえば、指定されたリストの数字の 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]

    コードの説明:

    <オール>
  • ここでは、数を含むシーケンスと呼ばれるリストを定義します。
  • マップされた値を格納するfiltered_resultという変数を宣言します
  • リストの各要素に対して実行され、その数値の 2 乗を返すラムダ関数
  • マップ関数によって返された結果を出力します。
  • 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

    コードの説明:

    <オール>
  • functools モジュールから reduce をインポート
  • ここでは、数を含むシーケンスと呼ばれるリストを定義します。
  • 削減された値を格納する product という変数を宣言します
  • リストの各要素に対して実行されるラムダ関数。前の結果に従って、その数の積を返します。
  • reduce 関数によって返された結果を出力します。
  • ラムダ関数を使用する理由 (および使用しない理由) は?

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

    ただし、いつラムダを使用するのが良い考えで、いつラムダを避けるべきかを知っておく必要があります。このセクションでは、ラムダを記述するときに 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]。

    まとめ

    [J5]表を追加しましたが、違いを理解するには説明が必要です。


    Python

    1. Python 関数の引数
    2. Python 匿名/Lambda 関数
    3. Python クロージャー
    4. C++ 演算子のオーバーロードと例
    5. C++ 関数とプログラム例
    6. Python Print() ステートメント:例を使用して印刷する方法
    7. 例を使用した Python 文字列 strip() 関数
    8. 例を使用した Python 文字列 count()
    9. Python String format() 例で説明
    10. Python String find() メソッドと例
    11. Python abs() 関数:絶対値の例