この記事では、Python の functools モジュールの共通関数の分析を主に紹介し、functools.cmp_to_key、functools.total_ordering、functools.reduce、functools.partial、functools.update_wrapper、functools.wraps の使用法をそれぞれ説明します。
Python に付属の functools モジュールは、他の関数を処理するために使用される特別な関数である、一般的に使用されるいくつかの高階関数を提供します。つまり、このモジュールを使用して呼び出し可能な オブジェクト を処理できます。
functoolsモジュール関数概要
functools.cmp_to_key(func)
functools.total_ordering(cls)
functools.reduce( function 、反復可能[、初期化子])
-
functools.partial(func[, args][, *keywords])
functools.update_wrapper(wrapper, Wrapper[, assigned][, updated])
functools.wraps(wrapped[, assigned][ 、更新されました])
functools.cmp_to_key()
構文:
functools.cmp_to_key(func)
functools.cmp_to_key(func)
该函数用于将旧式的比较函数转换为关键字函数。
旧式的比较函数:接收两个参数,返回比较的结果。返回值小于零则前者小于后者,返回值大于零则相反,返回值等于零则两者相等。
关键字函数:接收一个参数,返回其对应的可比较对象。例如 sorted(), min(), max(), heapq.nlargest(), heapq.nsmallest(), itertools.groupby() 都可作为关键字函数。
在 Python 3 中,有很多地方都不再支持旧式的比较函数,此时可以使用 cmp_to_key() 进行转换。
示例:
1 | sorted(iterable, key=cmp_to_key(cmp_func))
|
ログイン後にコピー
functools.total_ordering()
语法:
functools.total_ordering(cls)
这是一个类装饰器,用于自动实现类的比较运算。
我们只需要在类中实现 eq() 方法和以下方法中的任意一个 lt(), le(), gt(), ge(),那么 total_ordering() 就能自动帮我们实现余下的几种比较运算。
示例:
1 2 3 4 5 6 7 8 | @total_ordering
class Student:
def eq(self, other):
return ((self.lastname.lower(), self.firstname.lower()) ==
(other.lastname.lower(), other.firstname.lower()))
def lt(self, other):
return ((self.lastname.lower(), self.firstname.lower()) <
(other.lastname.lower(), other.firstname.lower()))
|
ログイン後にコピー
functools.reduce()
语法:
functools.reduce(function, iterable[, initializer])
该函数与 Python 内置的 reduce() 函数相同,主要用于编写兼容 Python 3 的代码。
functools.partial()
语法:
functools.partial(func[, *args][, **keywords])
この関数は、古い比較関数を次のように変換するために使用されます。キーワード機能。
古いスタイルの比較関数: 2 つのパラメータを受け取り、比較結果を返します。戻り値がゼロより小さい場合、前者は後者より小さく、戻り値がゼロより大きい場合はその逆が真で、戻り値がゼロに等しい場合、両者は等しいです。
Keyword 関数: パラメータを受け取り、対応する同等のオブジェクトを返します。例:
sorted()、min()、max()、heapq.nlargest()、heapq nsmall
est()、itertools.groupby() はすべてキーワード関数として使用できます。 Python 3 では、古い比較関数がサポートされなくなっているところが多くあります。現時点では、変換に cmp_to_key() を使用できます。 例:
1 2 3 4 5 6 7 8 9 | def partial(func, *args, **keywords):
def newfunc(*fargs, **fkeywords):
newkeywords = keywords. copy ()
newkeywords.update(fkeywords)
return func(*(args + fargs), **newkeywords)
newfunc.func = func
newfunc.args = args
newfunc.keywords = keywords
return newfunc
|
ログイン後にコピー
functools.total_ordering()
構文:
functools.total_ordering(cls)
これは、クラスの比較演算を自動的に実装するためのクラスデコレータです。 eq() メソッドと、次のメソッド lt()、le()、gt()、ge() のいずれかをクラスに実装するだけで済みます。その後、 total_ordering() が残りのメソッドの実装を自動的に支援します。比較演算。 例:
1 2 3 4 5 | >>> from functools import partial
>>> basetwo = partial(int, base=2)
>>> basetwo.doc = 'Convert base 2 string to an int.'
>>> basetwo('10010')
18
|
ログイン後にコピー
functools.reduce()
構文:
functools.reduce(function, iterable[,Initializer])
この関数はPythonの関数と同じです組み込みのreduce()関数は同じで、主にPython 3と互換性のあるコードを書くために使用されます。
functools.partial()
構文:
functools.partial(func[, *args][, **keywords])
🎜🎜この関数は部分オブジェクトを返します。このオブジェクトを呼び出すことの効果は、関数 func を呼び出して、位置パラメータ args およびキーワード パラメータキーワードを渡すことと同じです。オブジェクトが位置引数を使用して呼び出された場合、これらの引数は args に追加されます。キーワード引数が渡された場合、それらはキーワードに追加されます。 🎜🎜partial() 関数の同等の実装は、おおよそ次のとおりです。 🎜
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | >>> from functools import wraps
>>> def my_decorator(f):
... @wraps(f)
... def wrapper(*args, **kwds):
... print 'Calling decorated function '
... return f(*args, **kwds)
... return wrapper
>>> @my_decorator
... def example():
... "" "Docstring" ""
... print 'Called example function '
>>> example()
Calling decorated function
Called example function
>>> example.name
'example'
>>> example.doc
'Docstring'
|
ログイン後にコピー
🎜partial() 関数は主に、関数の一部のパラメーターを「フリーズ」し、より少ないパラメーターと簡単な使用法で関数オブジェクトを返すために使用されます。 🎜🎜例: 🎜rrreee🎜🎜functools.update_wrapper()🎜🎜🎜🎜 構文: 🎜🎜functools.update_wrapper(wrapper, Wrapped[, assigned][, updated]) 🎜🎜🎜この関数は 🎜update🎜 に使用されますラッパー関数(ラッパー) を使用して、元の関数のように見せます。オプションのパラメーターはタプルで、割り当てられたタプルは元の関数の値に直接置き換えられる🎜属性🎜を指定し、更新されたタプルは元の関数に対して更新される属性を指定します。これら 2 つのパラメータのデフォルト値は、それぞれ WRAPPER_ASSIGNMENTS と WRAPPER_UPDATES というモジュール レベルの定数です。前者はラッパー関数の名前、🎜module🎜、doc 属性の直接割り当てを指定し、後者はラッパー関数の dict 属性の更新を指定します。 🎜🎜この関数は主にデコレーター関数の定義で使用され、ラッパー関数の前に配置されます。ラッパー関数が更新されない場合、装飾された関数のメタ情報は、元の関数のメタ情報ではなく、ラッパー関数のメタ情報になります。 🎜🎜🎜functools.wraps()🎜🎜🎜🎜構文: 🎜🎜functools.wraps(wrapped[, assigns][, updated]) 🎜🎜🎜wraps() は、update_wrapper() 関数の呼び出しを簡素化します。これは、partial(update_wrapper、wraped=ラップ、assigned、updated=updated) と同等です。 🎜🎜例: 🎜rrreee🎜 この関数を使用しない場合、例内の関数名はラッパーになり、元の関数 example() のドキュメント (docstring) が失われます。 🎜🎜【関連おすすめ】🎜
1. Pythonの無料ビデオチュートリアル
2. Pythonの基本的な入門チュートリアル
3. Python meets データ収集のビデオチュートリアル
以上が分析関数ツールモジュール関数の例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。