Python Lambda 関数の説明 – KDnuggets


編集者による画像

コンピューター プログラミングの出現以来、関数は、再利用性、可読性、モジュール性、エラーの削減、簡単な変更などの利点を提供することにより、重要な役割を果たしてきました。 再利用可能性は、関数の最も有用な特性の 1 つと考えられていますが、再利用可能ではなくても有用な関数があると言ったらどうでしょうか? 調べるには、一緒に読んでください!

ラムダ関数には名前がなく、すぐに呼び出される関数です。 任意の数の引数を受け入れることができますが、通常の関数とは異なり、1 つの式のみを返します。

次の構文があります。

lambda parameters: expression

上記のラムダ関数の構文には、次の 3 つの要素があります。

  • キーワード「lambda」 — ユーザー定義関数の「def」に似ています
  • parameters — 通常の関数の引数に似ています
  • 式 — 結果に到達するために評価される操作です

通常の関数とは異なり、ラムダ関数ではパラメーターは括弧で囲まれません。 式がワンライナーであることを考慮すると、式は短くする必要がありますが、同時にパラメーターに対して必要な操作を実行する必要があります。 ラムダ関数は定義時に消費されるため、明示的に再定義しないと再利用できません。

通常、ラムダ関数は、Python 組み込み関数 (filter()、map()、または reduce()) などの高階関数に引数として渡されます。 しかし、高階関数とは何でしょう?

高階関数は、他の関数を引数として受け取る関数として定義されます (以降のセクションで説明します)。

構文に精通したので、簡単な例でラムダ関数を理解する時が来ました。 数値の二乗を求めたいとしましょう。 関数「square」を定義するか、以下に示すようにラムダ関数を記述できます。

def square(x):
    return x**2

上記のラムダ関数は、単一の引数 x を受け入れ、その二乗を返します。

Lambda 関数の呼び出し

ラムダ関数の呼び出しは、最初にラムダ関数の構造をラップし、次に括弧内に引数を入れるだけです。

複数の引数で呼び出す

複数の引数を持つラムダ関数の場合、入力パラメーターはコンマで区切られます。 対応する引数は、実行時に同じ順序に従います。

(lambda x, y, z: x**2 + y**2 + z**2)(1, 2, 0)

単一条件ステートメント

次の例に示すように、if-else ブロックなどの条件付き操作を実行することもできます。

(lambda x: 100 if x > 100 else (50 if x > 50 else x))(75)

ネストされた条件文

これらはワンライナー関数であるため、インデントではなく丸括弧を使用して条件付きネストが実行されます。

(lambda x: 100 if x > 100 else (50 if x > 50 else x))(75)

上記のラムダ関数に対応するユーザー定義関数は次のようになります。

def conditional_statement_demo(x):
    if x > 100:
        return100
    elif x > 50:
        return 50
    else:
        return x
conditional_statement_demo(75)

ネストされた条件のシナリオでは、ユーザー定義関数を選択することをお勧めします。

変数への代入

ラムダ関数を変数に割り当てて、ユーザー定義関数のように呼び出すこともできます。

square = lambda x: x**2
square(3)

関数を変数に割り当てることは可能ですが、ラムダ関数の唯一の目的、つまり即時呼び出しを無効にするため、控えめに使用されます。 変数の割り当ては、別の関数内でラムダ関数を使用する場合に便利です。

文字列連結

次の例は、2 つの文字列を連結する方法を示しています。ここでは、引数として渡された人の名前を使用してウェルカム メッセージを出力します。

welcome_msg = lambda name : print('Hi', name + '! This is your computer.')
welcome_msg(“Vidhi”)
Output >> Hi Vidhi! This is your computer.

ネストされた関数

Lambda 関数は、別の関数内で使用すると最も強力になります。

任意の数値の指数として使用される単一の引数を取るユーザー定義関数の例を考えてみましょう。

def power(y):
  return lambda x : x**y
square = power(2)
print(square(5))

アンダースコアによる呼び出し

魔法の時間です! ラムダ関数を呼び出す別の方法を見てみましょう。

lambda x, y : x**y
_(2,3)

ここで何が起こったのですか? 基本的に匿名関数であるラムダ関数を定義すると、「_」と引数を使用して呼び出されます。

map() での使用

Lambda 関数は、map() 関数の引数として頻繁に使用されます。 シーケンスを関数にマップし、明示的な定義を必要としません (特に、以下に示すような簡単な操作の場合)。

print(list(map(lambda x: x**2, range(1,11))))
Output >> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

map() は、1 から 10 までのシーケンスをラムダ関数にマップし、シーケンスのすべての要素の 2 乗を返します。

reduce() での使用

reduce 関数は、ラムダ関数で定義された操作を使用してシーケンスのすべての要素を操作し、単一の出力値を返します。 この例では、1 から 4 までのシーケンスのすべての要素を乗算し、出力を 1*2*3*4 = 24 として計算します。

from functools import reduce
print(reduce((lambda x, y: x * y), range(1,5)))

reduce をラムダ関数で使用して 2 つの要素のうち大きい方を返す別の例を見てみましょう。 リストが 2 番目の引数として渡されると、リストから最大の数値が返されます。

lst = [8, 9, 50, 6, 12]
print(reduce(lambda a, b: a if a > b else b, lst))

filter() での使用

ラムダ関数のもう 1 つの優れた使用法は、filter() です。 次の例では、数が奇数の場合、ラムダ関数は True を返します。 フィルタとともに使用すると、リスト内のすべての奇数が返されます。

lst = [12, 2, 8, 46, 3, 34, 68, 92, 49]
result = list(filter(lambda x: (x % 2 != 0), lst))
print(result)

Lambda 関数は非常に便利で、多くのコーディング作業を節約できます。 この投稿では、ラムダ関数の構文と、ユーザー定義関数との違いについて説明しました。 ラムダ関数の基本を始めるのに役立つことを願っています。

ヴィディ・チュー スケーラブルな機械学習システムを構築するために、製品、科学、エンジニアリングの交差点で働く AI ストラテジストであり、デジタル トランスフォーメーションのリーダーです。 彼女は受賞歴のあるイノベーション リーダーであり、作家であり、国際的な講演者でもあります。 彼女は、機械学習を民主化し、誰もがこの変革に参加できるよう専門用語を打ち破ることを使命としています。

Leave a Comment

Your email address will not be published. Required fields are marked *