例を含む Python Lambda 関数のガイド

この記事では、Python ラムダ関数と、それらの作成方法と使用方法を紹介します。

Python はオブジェクト指向プログラミング言語ですが、ラムダ関数は、さまざまな種類の関数型プログラミングを行うときに便利です。

注: この記事では、Python プログラミングと通常の関数の使用方法を既に理解していることを前提としています。 また、デバイスに Python 3.8 以降がインストールされていることも前提としています。

Python Lambda 関数の説明

Python では、関数は 1 つ以上の位置引数またはキーワード引数、引数の変数リスト、キーワード引数の変数リストなどを受け取ることができます。 それらは高階関数に渡され、出力として返されます。 通常の関数には、複数の式と複数のステートメントを含めることができます。 また、常に名前があります。

パイソンへ ラムダ関数 単なる無名関数です。 と呼ぶこともできます。 名無し 関数。 通常の Python 関数は、 def キーワード。 Python のラムダ関数は通常、 lambda キーワード、任意の数の引数、および 1 つの式。

注: 用語 ラムダ関数ラムダ式、 と ラムダ形式 プログラミング言語またはプログラマーに応じて、同じ意味で使用できます。

ラムダ関数は、主にワンライナーとして使用されます。 これらは、次のような高階関数内で非常に頻繁に使用されます map()filter(). これは、無名関数が引数として高階関数に渡されるためです。これは Python プログラミングだけで行われるわけではありません。

ラムダ関数は、Python でリスト内包表記を処理する場合にも非常に便利です。この目的で Python ラムダ式を使用するためのさまざまなオプションがあります。

ラムダは、Tkinter、wxPython、Kivy などの UI フレームワークで条件付きレンダリングに使用する場合に最適です。 この記事では Python GUI フレームワークの動作については説明しませんが、コード スニペットの中には、ユーザーの操作に基づいて UI をレンダリングするためにラムダ関数を多用していることを明らかにするものがあります。

Python Lambda 関数を掘り下げる前に理解しておくべきこと

Python はオブジェクト指向プログラミング言語であるため、すべてがオブジェクトです。 Python クラス、クラス インスタンス、モジュール、関数はすべてオブジェクトとして扱われます。

関数オブジェクトを変数に割り当てることができます。

Python で通常の関数に変数を割り当てることは珍しくありません。 この動作は、ラムダ関数にも適用できます。 これは、名前がなくても関数オブジェクトであるためです。

def greet(name):
    return f'Hello {name}'

greetings = greet
greetings('Clint')
>>>>
Hello Clint

map()、filter()、reduce() などの高階関数

次のような組み込み関数内でラムダ関数を使用する必要がある可能性があります。 filter()map()、また reduce() — 組み込み関数ではないため、Python の functools モジュールからインポートされます。 デフォルトでは、 高階関数 他の関数を引数として受け取る関数です。

以下のコード例に見られるように、通常の関数をラムダに置き換えて、これらの高階関数のいずれかに引数として渡すことができます。


names = ['Clint', 'Lisa', 'Asake', 'Ada']

greet_all = list(map(greet, names))
print(greet_all)
>>>>
['Hello Clint', 'Hello Lisa', 'Hello Asake', 'Hello Ada']

numbers = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
def multiples_of_three(x):
        return x % 3 == 0

print(list(filter(multiples_of_three, numbers)))
>>>>
[12, 15, 18]

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def add_numbers(x, y):
        return x * y

print(reduce(add_numbers, numbers))
>>>>
55

ステートメントと式の違い

開発者の間でよくある混乱のポイントは、プログラミングでステートメントと式を区別することです。

もっている 声明 何かを実行する、またはアクションを実行する任意のコードです。 ifwhile 条項。

表現 変数、値、および演算子の組み合わせで構成され、新しい値に評価されます。

この区別は、Python のラムダ関数の主題を調べるときに重要です。 以下のような式は値を返します。

square_of_three = 3 ** 2
print(square_of_three)
>>>>
9

ステートメントは次のようになります。

for i in range(len(numbers), 0, -1):
        if i % 2 == 1:
                print(i)
        else:
                print('even')
>>>>
even 9 even 7 even 5 even 3 even 1

Python Lambda 関数の使用方法

Python スタイル ガイドでは、すべてのラムダ関数がキーワードで始まる必要があると規定しています。 lambda (通常の関数とは異なり、 def キーワード)。 ラムダ関数の構文は、一般的に次のようになります。

lambda arguments : expression

Lambda 関数は、任意の数の位置引数、キーワード引数、またはその両方を取り、その後にコロンと 1 つの式のみを続けることができます。 構文上の制限があるため、複数の式を使用することはできません。 以下のラムダ式の例を見てみましょう。

add_number = lambda x, y : x + y
print(add_number(10, 4))
>>>>
14

上記の例から、ラムダ式が変数に割り当てられます add_number. 関数呼び出しは、14 に評価される引数を渡すことによって行われます。

以下に別の例を示します。

discounted_price = lambda price, discount = 0.1, vat = 0.02 : price * (1 - discount) * (1 + vat)

print(discounted_price(1000, vat=0.04, discount=0.3))
>>>>
728.0

上記のように、ラムダ関数は 728.0 に評価されます。 Python ラムダ関数では、位置引数とキーワード引数の組み合わせが使用されます。 位置引数を使用している間、関数定義で概説されている順序を変更することはできません。 ただし、キーワード引数は、位置引数の後にのみ任意の位置に配置できます。

Lambda 関数は、JavaScript の即時呼び出し関数式 (IIFE) と同じように常に実行されます。 次の例に示すように、これは主に Python インタープリターで使用されます。

print((lambda x, y: x - y)(45, 18))
>>>>
27

ラムダ関数オブジェクトは括弧で囲まれ、別の括弧のペアが渡された引数のすぐ後に続きます。 IIFE として式が評価され、関数は変数に割り当てられた値を返します。

Python ラムダ関数は、リスト内包表記内でも実行できます。 リスト内包表記には常に出力式があり、ラムダ関数に置き換えられます。 ここではいくつかの例を示します。

my_list = [(lambda x: x * 2)(x) for x in range(10) if x % 2 == 0]
print(my_list)
>>>>
[0, 4, 8, 12, 16]
value = [(lambda x: x % 2 and 'odd' or 'even')(x) for x in my_list] 
print(value)
>>>>
['even', 'even', 'even', 'even', 'even']

Python で三項式を記述するときに、Lambda 関数を使用できます。 もっている 三項句 与えられた条件に基づいて結果を出力します。 以下の例をご覧ください。

test_condition1 = lambda x: x / 5 if x > 10 else x + 5
print(test_condition1(9))
>>>>
14
test_condition2 = lambda x: f'{x} is even' if x % 2 == 0 else (lambda x: f'{x} is odd')(x)

print(test_condition2(9))
>>>>
9 is odd

高階関数内のラムダ関数

高階関数の概念は、他の言語と同様に Python でも一般的です。 これらは、他の関数を引数として受け入れ、関数を出力として返す関数です。

Python では、高階関数は関数と iterable の 2 つの引数を取ります。 関数の引数は、反復可能なオブジェクトの各項目に適用されます。 関数を引数として高階関数に渡すことができるので、ラムダ関数を同様に渡すことができます。

で使用されるラムダ関数の例を次に示します。 map() 関数:

square_of_numbers = list(map(lambda x: x ** 2, range(10)))

print(square_of_numbers)
>>>>
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
strings = ['Nigeria', 'Ghana', 'Niger', 'Kenya', 'Ethiopia', 'South Africa', 'Tanzania', 'Egypt', 'Morocco', 'Uganda']

length_of_strings = list(map(lambda x: len(x), strings))

print(length_of_strings)
>>>>
[7, 5, 5, 5, 8, 12, 8, 5, 7, 6]

で使用されるいくつかのラムダ関数を次に示します。 filter() 関数:

length_of_strings_above_five = list(filter(lambda x: len(x) > 5, strings))

print(length_of_strings_above_five)
>>>>
['Nigeria', 'Ethiopia', 'South Africa', 'Tanzania', 'Morocco', 'Uganda']
fruits_numbers_alphanumerics = ['apple', '123', 'python3', '4567', 'mango', 'orange', 'web3', 'banana', '890']

fruits = list(filter(lambda x: x.isalpha(), fruits_numbers_alphanumerics))

numbers = list(filter(lambda x: x.isnumeric(), fruits_numbers_alphanumerics))

print(fruits)
print(numbers)
>>>>
['apple', 'mango', 'orange', 'banana']
['123', '4567', '890']

で使用されるいくつかのラムダ関数を次に示します。 reduce() 関数:

values = [13, 6, 12, 23, 15, 31, 16, 21]
max_value = reduce(lambda x,y: x if (x > y) else y, values)
print(max_value)
>>>>
31
nums = [1, 2, 3, 4, 5, 6]
multiplication_of_nums = reduce(lambda x,y: x*y, nums)

print(multiplication_of_nums)
>>>>
720

結論

Python ラムダを使用すると、記述するコードの行数を大幅に減らすことができますが、慎重に使用し、必要な場合にのみ使用する必要があります。 コードの読みやすさは、簡潔さよりも優先する必要があります。 コードを読みやすくするには、Python スタイル ガイドで推奨されているように、ラムダ関数よりも適切な通常の関数を常に使用してください。

ラムダは Python の 3 項式で非常に便利ですが、読みやすさを犠牲にしないようにしてください。 ラムダ関数は、高階関数が使用されているときに真価を発揮します。

要約すれば:

  • Python ラムダは、ワンライナー関数を記述するのに適しています。
  • これらは、IIFE (即時に呼び出される関数式) にも使用されます。
  • コードが読めなくなるため、複数の式がある場合はラムダを使用しないでください。
  • Python はオブジェクト指向プログラミング言語ですが、ラムダは Python で関数型プログラミングを調べるのに適した方法です。

関連性のあるコンテンツ:

Leave a Comment

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