Python Language
Functoolsモジュール
サーチ…
部分的な
partial
関数は、別の関数から部分関数アプリケーションを作成します。これは、関数の引数(またはキーワード引数)のいくつかに値をバインドし 、すでに定義されている引数を持たない呼び出し可能オブジェクトを生成するために使用されます。
>>> from functools import partial
>>> unhex = partial(int, base=16)
>>> unhex.__doc__ = 'Convert base16 string to int'
>>> unhex('ca11ab1e')
3390155550
partial()
は、名前が示唆するように、関数の部分的な評価を可能にします。次の例を見てみましょう:
In [2]: from functools import partial
In [3]: def f(a, b, c, x):
...: return 1000*a + 100*b + 10*c + x
...:
In [4]: g = partial(f, 1, 1, 1)
In [5]: print g(2)
1112
g
が生成されると、4つの引数( a, b, c, x
)を取るf
も最初の3つの引数a, b, c,
f
評価はg
が呼び出されると完了し、 g(2)
はf
4番目の引数を渡します。
partial
を考える方法の1つはシフトレジスタです。当時の1つの議論をいくつかの機能に押し込んだ。 partial
は、データがストリームとして入力され、複数の引数を渡すことができない場合に便利です。
total_ordering
__eq()__
可能なクラスを作成するには、通常、メソッド__eq()__
、 __lt__()
、 __le__()
、 __gt__()
および__ge__()
を定義する必要があります。
クラスに適用されたtotal_ordering
デコレータは、 __eq__()
__lt__()
、 __le__()
、 __gt__()
および__ge__()
間で__eq__()
と1 __eq__()
の定義を許可し、クラスのすべての順序付け操作を許可します。
@total_ordering
class Employee:
...
def __eq__(self, other):
return ((self.surname, self.name) == (other.surname, other.name))
def __lt__(self, other):
return ((self.surname, self.name) < (other.surname, other.name))
デコレータは、提供されたメソッドと代数演算のコンポジションを使用して、他の比較メソッドを導出します。たとえば、 __lt__()
と__eq()__
を定義し、 __lt__()
を派生させたい__gt__()
ではnot __lt__() and not __eq()__
簡単にチェックできます。
注 : total_ordering
関数は、Python 2.7以降でのみ使用できます。
減らす
Pythonの3.xのでは、 reduce
既に説明した機能ここでは、組み込み関数から削除されており、現在から輸入しなければならないfunctools
。
from functools import reduce
def factorial(n):
return reduce(lambda a, b: (a*b), range(1, n+1))
lru_cache
@lru_cache
デコレータは、 最も最近使用されていないキャッシュを使用して、高価で計算集約型の関数をラップするために使用できます。これにより、関数呼び出しをメモすることができ、同じパラメータを使用した将来の呼び出しを再計算しなくても即座に返すことができます。
@lru_cache(maxsize=None) # Boundless cache
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
>>> fibonacci(15)
上記の例では、値のfibonacci(3)
あれば、一方だけ、一度計算されるfibonacci
LRUキャッシュを持っていなかった、 fibonacci(3)
230回の上方に計算されたであろう。したがって、 @lru_cache
は再帰関数や動的プログラミングに特に@lru_cache
ます。高価な関数を同じ正確なパラメータで複数回呼び出すことができます。
@lru_cache
は2つの引数があります
-
maxsize
:保存するコールの数。ユニークなコールの数がmaxsize
を超えると、LRUキャッシュは最も最近に使用されたコールを削除します。 -
typed
(3.3で追加):異なる型の同等の引数が異なるキャッシュレコードに属しているかどうかを判断するためのフラグです(つまり、3.0
と3
が異なる引数としてカウントされる場合)
キャッシュの統計情報も表示されます。
>>> fib.cache_info()
CacheInfo(hits=13, misses=16, maxsize=None, currsize=16)
注 : @lru_cache
は辞書を使用して結果をキャッシュするので、関数のすべてのパラメータは、キャッシュが機能するためにハッシュ可能でなければなりません。
@lru_cache
公式Pythonドキュメント 。 @lru_cache
は3.2で追加されました。
cmp_to_key
Pythonは、キー関数を受け入れるメソッドのソートを変更しました。これらの関数は値をとり、配列をソートするために使用されるキーを返します。
古い比較関数は、2つの値を取るために使用され、最初の引数が2番目の引数と同じか小さい場合は-1、0または+1を返します。これは、新しいキー機能と互換性がありません。
それはfunctools.cmp_to_key
が入る場所functools.cmp_to_key
:
>>> import functools
>>> import locale
>>> sorted(["A", "S", "F", "D"], key=functools.cmp_to_key(locale.strcoll))
['A', 'D', 'F', 'S']
Python標準ライブラリのドキュメントから取られた例