Python Functools 部分関数

Migel Hewage Nimesha 2024年2月15日
  1. Python で Functools partial() 関数を使用する
  2. まとめ
Python Functools 部分関数

Functools は、他の関数に作用したり、他の関数を返したりする高次関数を操作するときに Python で使用される標準フレームワークであり、関数を書き換えずに拡張または使用するのに役立ちます。 Functools を使用すると、コードが読みやすくなり、保守が容易になり、効率が高くなります。

このライブラリには、partialpartialmethod の 2つの主要な関数が含まれています。 partialmethod は、特定の引数に対して既に定義されている関数の呼び出し不可能なメソッド記述子であり、新しい partialmethod 記述子を返します。

partial() 関数を見てみましょう。

Python で Functools partial() 関数を使用する

partial() 関数は、関数を入力として取り、他の関数と同様にプログラムで使用できる関数を返す高階関数です。 多くの引数を持つ関数があり、その関数を使用するたびに 1つまたは 2つの引数のみを変更する必要がある場合、Functools ライブラリに付属する partial() 関数がそのような状況で役立ちます。

partial() 関数の助けを借りて、関数から特定の数の引数を凍結し、単純化された新しいものを作成して、位置引数とキーワードを含む新しい partial() オブジェクトを返すことができます。 したがって、元の関数を書き直すことができなくなります。

全体として、partial() は便利なツールであり、特に単一のオブジェクトにさまざまな入力を適用したり、関数の引数の 1つを定数にラップしたりする場合に便利です。 したがって、partial() 関数を使用した最終的な結果は、エレガントで読みやすく、再利用可能なコードを出力します。

partial() 関数を使用する前に、Functools ライブラリからインポートする必要があります。 関数を実装する方法を見てみましょう。

from functools import partial

上記のコードを使用して partial ライブラリをインポートしたので、以下のように partial コマンドを使用できます。 次に、必要に応じて partial() 関数を呼び出すと、定義された関数に似た関数が固定値とともに出力されます。

以下は、標準化された partial() 関数とその属性です。

partial(func, /, *args, **keywords)

partial 関数は、関数、引数、およびキーワードの 3つの主要な属性で構成されます。

  1. partial.func (関数名) - 親関数の名前と 16 進アドレスを返す呼び出し可能なオブジェクトまたは関数。
  2. partial.args (位置引数) - この属性は、事前に割り当てられた引数を partial() 関数に返します。
  3. partial.keyword (キーワード引数) - この属性は、事前に割り当てられたキーワードを partial() 関数に返します。

partial() 関数とその属性を使用して例を定義しましょう。

完全なコード:

from functools import partial

# original function


def multiply(a, b):
    return a * b


# partial function to multiply a as 2
multiplication1 = partial(multiply, 2)
print(multiplication1(4))

# partial function to multiply b as 7
multiplication2 = partial(multiply, b=7)
print(multiplication2(3))

# simple multiply function with two variables
print(multiply(5, 2))

# partial function with two values and multiply function
multiplication3 = partial(multiply, 2, 5)
print(multiplication3())

# defining some attributes in multiplication1, multiplication2 multiplication3
print("Function used in multiplication1 :", multiplication1.func)
print("Keywords for multiplication2 :", multiplication2.keywords)
print("Arguments for multiplication3 :", multiplication3.args)

出力:

Python Functools 部分 - 出力 1

まず、functools から partial() 関数をインポートし、ab の 2つの変数を持つ multiply() という名前の関数を定義しました。 この multiply 関数は、2つの数値 (a,b) を乗算します。

from functools import partial


def multiply(a, b):
    return a * b

以下のコード チャンクでは、partial() 関数が呼び出され、2 の固定値と共に関数オブジェクト multiply() を出力します。 ここで、partial() 関数は、a2 として multiply() を呼び出します。

印刷するときは、b4 を代入し、結果を 8 として印刷します。

multiplication1 = partial(multiply, 2)
print(multiplication1(4))

ここで、partial() 関数が呼び出されると、multiply() 関数と b に割り当てられた値を 3. として出力します。 元の関数のパラメーターをスキップして、変数 b の値を指定しています。

印刷するとき、a の値を 3 として定義し、出力を 21 として表示します。

multiplication2 = partial(multiply, b=7)
print(multiplication2(3))

partial() 関数は、2つの変数の値で関数を呼び出す場合には必須ではありません。 通常どおり、a には 5b には 2 を使用し、結果を 10 として出力します。

print(multiply(5, 2))

元の関数は partial() 関数を呼び出すときに 2つのパラメーターを持っているため、問題にはならず、a2b5 として multiply() を使用します。 次に、結果を 10 として表示します。

multiplication3 = partial(multiply, 2, 5)
print(multiplication3())

以下のコード チャンクは、関数 multiplication1 で使用される関数、multiplication2 でキーワード、multiplication3 で引数をそれぞれ表示します。 したがって、multiplication1 で使用される関数は multiply() であり、その 16 進値は 000001E523A6E4C0 です。

multiplication2 では {'b': 7} をキーワードとして使用し、2, 5multiplication3 で使用される引数です。

print("Function used in multiplication1 :", multiplication1.func)
print("Keywords for multiplication2 :", multiplication2.keywords)
print("Arguments for multiplication3 :", multiplication3.args)

まとめ

この記事では、functools ライブラリの partial() 関数について説明しました。 前の例で見たように、partial() 関数を使用すると、コードがより読みやすく、洗練され、高速になります。

1つ以上の引数をフリーズする関数を見つけた場合、その状況には partial() 関数が最適です。

Migel Hewage Nimesha avatar Migel Hewage Nimesha avatar

Nimesha is a Full-stack Software Engineer for more than five years, he loves technology, as technology has the power to solve our many problems within just a minute. He have been contributing to various projects over the last 5+ years and working with almost all the so-called 03 tiers(DB, M-Tier, and Client). Recently, he has started working with DevOps technologies such as Azure administration, Kubernetes, Terraform automation, and Bash scripting as well.

関連記事 - Python Function