首頁  >  文章  >  後端開發  >  實例解析functools模組函數

實例解析functools模組函數

Y2J
Y2J原創
2017-05-09 14:54:091566瀏覽

這篇文章主要介紹了Python中functools模組的常用函數解析,分別講解了functools.cmp_to_key,functools.total_ordering,functools.reduce,functools.partial,functools.update_wrapper和functools.rapwraps.可以參考下

Python自帶的functools 模組提供了一些常用的高階函數,也就是用來處理其它函數的特殊函數。換言之,就是能使用該模組對可呼叫物件進行處理。

functools模組函數概覽

  • #functools.cmp_to_key(func)

  • #functools.total_ordering(cls)

  • #functools.reduce(function, iterable[, initializer])

  • functools.partial (func[, args][, *keywords])

  • functools.update_wrapper(wrapper, wrapped[, assigned][, updated])

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

##functools.cmp_to_key()

#functools.cmp_to_key()

# #語法:

functools.cmp_to_key(func) 

此函數用於將舊式的比較函數轉換為關鍵字函數。

舊式的比較函數:接收兩個參數,傳回比較的結果。傳回值小於零則前者小於後者,回傳值大於零則相反,回傳值等於零則兩者相等。 關鍵字函數:接收一個參數,並傳回其對應的可比較物件。例如sort

ed(), min(), max(), heapq.nlargest(), heapq.nsm

all

est(), 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]) 

此函數傳回一個partial 對象,呼叫該物件的效果相當於呼叫func 函數,並傳入位置參數args 和關鍵字參數keywords 。如果在呼叫該物件時傳入了位置參數,則這些參數會被加入到 args 中。如果傳入了關鍵字參數,則會被加入到 keywords 中。

partial() 函數的等價實作大致如下:

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

partial() 函數主要用於「凍結」某個函數的部分參數,傳回一個參數更少、使用更簡單的函數物件。

範例:

>>> 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.update_wrapper()

語法:


functools.update_wrapper(wrapper, wrapped [, assigned][, updated]) 

此函數用於更新包裝函數(wrapper),讓它看起來像原始函數一樣。可選的參數是一個元組,assigned 元組指定要直接使用原函數的值進行替換的屬性,updated 元組指定要對照原始函數進行更新的屬性。這兩個參數的預設值分別是模組層級的常數:WRAPPER_ASSIGNMENTS 和 WRAPPER_UPDATES。前者指定了對包裝函數的 name, 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)就會遺失。

【相關推薦】###

1. Python免費視訊教學

##2.

Python基礎入門教學

3.

Python遇見資料擷取影片教學

以上是實例解析functools模組函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn