ホームページ  >  記事  >  バックエンド開発  >  Python での functools モジュール関数分析について

Python での functools モジュール関数分析について

高洛峰
高洛峰オリジナル
2017-03-13 09:15:301758ブラウズ

この記事では主に

Pythonのfunctoolsモジュール関数の解析を紹介し、それぞれfunctools.cmp_to_key、functools.total_ordering、functools.reduce、functools.partial、functools.upについて説明します。 date_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() 进行转换。

示例:


sorted(iterable, key=cmp_to_key(cmp_func))

functools.total_ordering()

语法:

functools.total_ordering(cls) 

这是一个类装饰器,用于自动实现类的比较运算。

我们只需要在类中实现 eq() 方法和以下方法中的任意一个 lt(), le(), gt(), ge(),那么 total_ordering() 就能自动帮我们实现余下的几种比较运算。

示例:


@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 つのパラメータを受け取り、比較結果を返します。戻り値がゼロより小さい場合、前者は後者より小さく、戻り値がゼロより大きい場合はその逆が真で、戻り値がゼロに等しい場合、両者は等しい。

キーワード関数: パラメータを受け取り、対応する同等のオブジェクトを返します。例: sort

ed()、min()、max()、heapq.nlargest()、heapq nsmall

est()、itertools.groupby() はすべてキーワード関数として使用できます。


Python 3 では、多くの場所で古い比較関数がサポートされなくなりました。現時点では、変換に cmp_to_key() を使用できます。

例:

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() が残りのメソッドの実装を自動的に支援します。比較演算。 例:

>>> from functools import partial
>>> basetwo = partial(int, base=2)
>>> basetwo.doc = &#39;Convert base 2 string to an int.&#39;
>>> basetwo(&#39;10010&#39;)
18
functools.reduce()

🎜🎜🎜構文:🎜🎜functools.reduce(function, iterable[,Initializer]) 🎜🎜🎜この関数はPython と同じ 組み込みのreduce()関数は同じで、主にPython 3と互換性のあるコードを書くために使用されます。 🎜🎜🎜functools.partial()🎜🎜🎜🎜構文: 🎜🎜functools.partial(func[, *args][, **keywords]) 🎜🎜🎜この関数は部分オブジェクトを返します。このオブジェクトを呼び出すことの効果は、関数 func を呼び出して、位置パラメータ args およびキーワード パラメータキーワードを渡すことと同じです。オブジェクトが位置引数を使用して呼び出された場合、これらの引数は args に追加されます。キーワード引数が渡された場合、それらはキーワードに追加されます。 🎜🎜partial() 関数の同等の実装は、おおよそ次のとおりです: 🎜🎜🎜🎜
>>> from functools import wraps
>>> def my_decorator(f):
...   @wraps(f)
...   def wrapper(*args, **kwds):
...     print &#39;Calling decorated function&#39;
...     return f(*args, **kwds)
...   return wrapper

>>> @my_decorator
... def example():
...   """Docstring"""
...   print &#39;Called example function&#39;

>>> example()
Calling decorated function 
Called example function 
>>> example.name
&#39;example&#39; 
>>> example.doc
&#39;Docstring&#39;
🎜partial() 関数は主に、関数の一部のパラメーターを「フリーズ」し、パラメーターが少なく、より簡単に使用できる関数オブジェクトを返すために使用されます。 🎜🎜例:🎜🎜🎜🎜rrreee🎜🎜functools.update_wrapper()🎜🎜🎜🎜構文:🎜🎜functools.update_wrapper(wrapper, Wrapped[, assigned][, updated]) 🎜🎜🎜この関数は使用されます🎜アップデート🎜関数をラップして、元の関数のように見せます。オプションのパラメーターはタプルで、割り当てられたタプルは元の関数の値に直接置き換えられる🎜属性🎜を指定し、更新されたタプルは元の関数に対して更新される属性を指定します。これら 2 つのパラメータのデフォルト値は、それぞれ WRAPPER_ASSIGNMENTS と WRAPPER_UPDATES というモジュール レベルの定数です。前者はラッパー関数の名前、🎜module🎜、doc 属性の直接割り当てを指定し、後者はラッパー関数の dict 属性の更新を指定します。 🎜

该函数主要用于装饰器函数的定义中,置于包装函数之前。如果没有对包装函数进行更新,那么被装饰后的函数所具有的元信息就会变为包装函数的元信息,而不是原函数的元信息。

functools.wraps()

语法:

functools.wraps(wrapped[, assigned][, updated]) 

wraps() 简化了 update_wrapper() 函数的调用。它等价于 partial(update_wrapper, wrapped=wrapped, assigned, updated=updated)。

示例:


>>> from functools import wraps
>>> def my_decorator(f):
...   @wraps(f)
...   def wrapper(*args, **kwds):
...     print &#39;Calling decorated function&#39;
...     return f(*args, **kwds)
...   return wrapper

>>> @my_decorator
... def example():
...   """Docstring"""
...   print &#39;Called example function&#39;

>>> example()
Calling decorated function 
Called example function 
>>> example.name
&#39;example&#39; 
>>> example.doc
&#39;Docstring&#39;

如果不使用这个函数,示例中的函数名就会变成 wrapper ,并且原函数 example() 的说明文档(docstring)就会丢失。

以上がPython での functools モジュール関数分析についての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。