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
-
一部のPython関数の前後にアンダースコア__が付いているのはなぜですか?
上記のように先頭と末尾に2つのアンダースコアが付いた名前は、基本的にPython組み込み関数用に予約されていることに注意してください。同様の名前を使用しない方がよいでしょう。
-
Python関数はどのようにして関数を返すことができますか?
Pythonはファーストクラスの関数をサポートしています。実際、Pythonのすべての関数はファーストクラスの関数です。 Pythonは関数から関数を返し、リストなどのコレクションに関数を格納し、通常は変数やオブジェクトと同じように扱います。 他の関数で関数を定義し、関数を返すことはすべて可能です。 指定されたコードは次のように作り直されています。関数内で関数を定義し、これらを返します。 例 def f2(c, d): return c, d def f1(a, b): c = a + 1 d = b +