Python
 Computer >> コンピューター >  >> プログラミング >> Python

Functools —Pythonの呼び出し可能オブジェクトに対する高階関数と操作


Pythonの関数は高階関数であると言われています。これは、引数として別の関数に渡すことができ、および/または他の関数を返すこともできることを意味します。 functoolsモジュールは、そのような高階関数のための重要なユーティリティを提供します。

partial()関数

この関数は、呼び出し可能な「部分的」オブジェクトを返します。オブジェクト自体は関数のように動作します。部分()関数は、引数として別の関数を受け取り、関数の引数の一部をフリーズして、簡略化された署名を持つ新しいオブジェクトを作成します。

組み込みのint()関数は、数値を10進整数に変換します。 int()のデフォルトの署名は

int(x, base = 10)

部分()関数を使用して、基本引数のデフォルトが2であるint()関数のように動作する呼び出し可能オブジェクトを作成できます。

>>> import functools
>>> binint = functools.partial(int, base = 2)
>>> binint('1001')
9

次の例では、元の関数の引数の1つにデフォルト値を設定することにより、ユーザー定義関数myfunction()を部分関数の引数として使用しています。

>>> def myfunction(a,b):
return a*b

>>> partfunction = functools.partial(myfunction,b = 10)
>>> partfunction(10)
100

partialmethod()

この関数は、直接呼び出すのではなく、メソッド定義として使用するように設計されていることを除いて、partialのように動作する新しいpartialmethod記述子を返します。

Cmp_to_key()関数

Python 2.xには、2つのオブジェクトを比較するためのcmp()関数がありました。 Python3はそれを非推奨にしました。 functoolsモジュールは、ユーザー定義クラスのオブジェクトの比較を実行できるcmp_to_key()関数を提供します

from functools import cmp_to_key

class test:
def __init__(self,x):
self.x = x
def __str__(self):
return str(self.x)
def cmpr( a,b):
if a.x> = b.x: return True
if a.x<b.x: return False
mykey = cmp_to_key(cmpr)

reduce()関数

reduce()関数は、関数とiterableの2つの引数を受け取ります。ただし、単一の値を返します。引数関数は、リスト内の2つの引数を左から右に累積的に適用されます。最初の呼び出しでの関数の結果が最初の引数になり、リストの3番目の項目が2番目になります。これは、リストがなくなるまで繰り返されます。

以下の例では、2つの数値の積を返すようにmult()関数が定義されています。この関数は、1から10までの数値の範囲とともにreduce()関数で使用されます。出力は10の階乗値です。

import functools
def mult(x,y):
return x*y

num = functools.reduce(mult, range(1,11))
print ('factorial of 10: ',num)

出力

factorial of 10: 3628800

  1. 一部のPython関数の前後にアンダースコア__が付いているのはなぜですか?

    上記のように先頭と末尾に2つのアンダースコアが付いた名前は、基本的にPython組み込み関数用に予約されていることに注意してください。同様の名前を使用しない方がよいでしょう。

  2. Python関数はどのようにして関数を返すことができますか?

    Pythonはファーストクラスの関数をサポートしています。実際、Pythonのすべての関数はファーストクラスの関数です。 Pythonは関数から関数を返し、リストなどのコレクションに関数を格納し、通常は変数やオブジェクトと同じように扱います。 他の関数で関数を定義し、関数を返すことはすべて可能です。 指定されたコードは次のように作り直されています。関数内で関数を定義し、これらを返します。 例 def f2(c, d):     return c, d def f1(a, b):     c = a + 1     d = b +