functools

functools模塊用于高階函數(shù):作用與或者返回其它函數(shù)的函數(shù)。一般來(lái)說(shuō),對(duì)于該模塊,任何可調(diào)用對(duì)象都可以視為一個(gè)函數(shù)

[TOC]

cmp_to_key

參考 CSDN網(wǎng)站中的文章大星星的專(zhuān)欄

Help on function cmp_to_key in module functools:

cmp_to_key(mycmp)
    Convert a cmp= function into a key= function

幫助文檔說(shuō)的很簡(jiǎn)單 將 比較函數(shù)轉(zhuǎn)換為key函數(shù),這就引出三個(gè)問(wèn)題1:什么是比較函數(shù);2:什么是key函數(shù);3:怎么將cmp函數(shù)轉(zhuǎn)為key函數(shù);3:為什么要py3要取消cmp函數(shù)

  1. 什么是比較函數(shù)

    py3中取消了cmp函數(shù) 而這個(gè)函數(shù)在py2中是BIF,定義如下:

    Help on built-in function cmp in module __builtin__:
    
    cmp(...)
        cmp(x, y) -> integer
    
        Return negative if x<y, zero if x==y, positive if x>y.
    
    

    如果是x小于y則返回一個(gè)負(fù)數(shù);如果z>y則返回一個(gè)正數(shù);如果x==y則返回0

  2. 什么是key函數(shù)
    key函數(shù)接受一個(gè)參數(shù),返回一個(gè)可以用作排序的關(guān)鍵字(有點(diǎn)感覺(jué)是hash了)

  3. 怎么將cmp函數(shù)轉(zhuǎn)為key函數(shù)

    • 因?yàn)?code>python3不存在cmp函數(shù)了呀 導(dǎo)致很多函數(shù)不支持cmp了 比如看sorted的幫助文檔:
      • py2
        Help on built-in function sorted in module __builtin__:
        
        sorted(...)
            sorted(iterable, cmp=None, key=None, reverse=False) --> new sorted list
        
      • py3
        Help on built-in function sorted in module builtins:
        
        sorted(iterable, key=None, reverse=False)
            Return a new list containing all items from the iterable in ascending order.
        
            A custom key function can be supplied to customise the sort order, and the
            reverse flag can be set to request the result in descending order.
        
        
    • 很簡(jiǎn)單 在py2設(shè)計(jì)過(guò)一個(gè)cmp函數(shù)了,但是到py3不能用了怎么辦?用functools.cmp_to_key啊:
      1. 對(duì)序列 a=range(10)進(jìn)行排序
      2. 首先定義一個(gè)比較函數(shù):比較x+4和y的大小關(guān)系
        >>> cmp_func = lambda x,y: x+4 >y
        >>> cmp_func(3,10)
        False
        >>> cmp_func(3,1)
        True
        >>> cmp_func(3,7)
        False
        >>> cmp_func(3,6)
        True
        
      3. py2 排序的時(shí)候直接用cmp參數(shù)
        >>> sorted(a, cmp=cmp_func)
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
        
      4. py3沒(méi)有cmp參數(shù) 只有key參數(shù)
        # 當(dāng)然py2中也是可以采用這種方法的
        >>> sorted(a, key=functools.cmp_to_key(cmp_func))
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
        
    • 參考Chi's Blog網(wǎng)站中的文章Python3中排序的cmp函數(shù)的替代方法
## functools.reduce
> functools.reduce 和BIF reduce的功能很相似
以下是兩種方法的定義
- functools.reduce
```
Help on built-in function reduce in module _functools:
reduce(...)
    reduce(function, sequence[, initial]) -> value

    Apply a function of two arguments cumulatively to the items of a sequence,
    from left to right, so as to reduce the sequence to a single value.
    For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
    ((((1+2)+3)+4)+5).  If initial is present, it is placed before the items
    of the sequence in the calculation, and serves as a default when the
    sequence is empty.

```
- reduce
```
Help on built-in function reduce in module __builtin__:

reduce(...)
    reduce(function, sequence[, initial]) -> value

    Apply a function of two arguments cumulatively to the items of a sequence,
    from left to right, so as to reduce the sequence to a single value.
    For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
    ((((1+2)+3)+4)+5).  If initial is present, it is placed before the items
    of the sequence in the calculation, and serves as a default when the
    sequence is empty.

```
可以看到兩個(gè)方法連定義都一模一樣, 但是以上是在python2中的測(cè)試結(jié)果,在python3中是沒(méi)有reduce這個(gè)BIF的,這就是這兩個(gè)函數(shù)的本質(zhì)區(qū)別: **引入functools.reduce就是為了兼容python3的**,下面就以reduce說(shuō)明一下功能:
> 對(duì)序列`sequence`連續(xù)使用函數(shù)`function`;如果給出 初始值`initial`,會(huì)首先將initial加到`sequence`的頭部;第一次將序列的頭兩個(gè)元素進(jìn)行`function`計(jì)算,以后每次都是使用前一次的計(jì)算結(jié)果和下一個(gè)元素進(jìn)行計(jì)算

- 無(wú)初始值
```
>>> reduce(lambda x,y:x*y, xrange(1,6))
120
>>>
```
- 有初始值
```
>>> reduce(lambda x,y:x*y, xrange(1,6), 10)
1200
>>>
```


## functools.total_ordering

類(lèi)裝飾器 當(dāng)你需要自定義一個(gè)類(lèi)的比較方法時(shí),默認(rèn)你需要定義 等于eq 大于gt 小于lt 大于等于ge 小于等于le 有可能還要定義不等于(ne) 但是如果適用了這個(gè)類(lèi)裝飾器 那么只需要定義 eq 和 lt le gt ge中的一個(gè)就好了

@functools.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()))

print(dir(Student))
# ['__doc__', '__eq__', '__ge__', '__gt__', '__le__', '__lt__', '__module__']

partial

偏函數(shù) 最常用的應(yīng)用場(chǎng)景是固定一個(gè)函數(shù)的某些參數(shù)

如果有大量二進(jìn)制轉(zhuǎn)換任務(wù),我們可能定義一個(gè)in2函數(shù)

>>> int('10010', base=2)
18
>>> def in2(x, base=2):
...     return int(x, base)
...
>>> in2('1010')
10

但是我們也可以直接簡(jiǎn)單生成

>>> in22 = functools.partial(int, base=2)
>>> in22('11001')
25

partialmethod

類(lèi)似于 partial 但是 只有 partialmethod才能作用于方法

lru_cache

緩存函數(shù)的運(yùn)行結(jié)果:遞歸求斐波拉切數(shù)列時(shí)可以緩存某個(gè)結(jié)果;緩存網(wǎng)絡(luò)請(qǐng)求等

lru_cache(maxsize=128, typed=False)
maxsize是指定最大緩存數(shù)量, typed則代表是否嚴(yán)格判斷類(lèi)型如果設(shè)置為False,則參數(shù)3.0不能使用參數(shù)為3的緩存

update_wrapper

update_wrapper 類(lèi)似于 wraps 甚至 @wraps內(nèi)部實(shí)際上就是基于update_wrapper來(lái)實(shí)現(xiàn)的

def wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS, updated=WRAPPER_UPDATES):
    def decorator(wrapper):
        return update_wrapper(wrapper, wrapped=wrapped...)
    return decorator

wraps

裝飾器會(huì)遺失被裝飾函數(shù)的namedoc等屬性,可以使用@wraps 來(lái)恢復(fù)

singledispatch

JAVA等語(yǔ)言可以類(lèi)的重載,可以為同一個(gè)方法不同類(lèi)型參數(shù)執(zhí)行不同的方法, 但Python不支持同名方法有不同的參數(shù)類(lèi)型,python給我們的解決方案是使用 singledispatch 來(lái)動(dòng)態(tài)指定相應(yīng)的方法所接收的參數(shù)類(lèi)型,而不用把參數(shù)判斷放到方法內(nèi)部去判斷從而降低代碼的可讀性

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1 functools函數(shù) functools模塊用于高階函數(shù):作用與或者返回其它函數(shù)的函數(shù)。一般來(lái)說(shuō),對(duì)于該模塊...
    lakerszhy閱讀 10,118評(píng)論 0 7
  • functools模塊提供了高階函數(shù)功能:函數(shù)可以作為或者返回其他函數(shù)。通常, 任何可調(diào)用對(duì)象可以被視為在本模塊的...
    cb9e58ff5a37閱讀 1,348評(píng)論 0 0
  • 上海餐飲管理系統(tǒng)哪家好 古語(yǔ)有云:“民以食為天”,衣食住行是人們的基本需求,同時(shí)也對(duì)應(yīng)催生了龐大的商業(yè)市場(chǎng)。餐飲行...
    水果生鮮閱讀 353評(píng)論 0 0
  • Facebook 在 2016 年 6 月底,月活用戶(hù)數(shù)量達(dá)到了 16.5 億——這幾乎是全球人口總數(shù)的 1/5 ...
    做不死閱讀 341評(píng)論 0 0
  • 文圖/胡多錢(qián) 自媒體從美國(guó)新聞學(xué)會(huì)媒體中心于2003年7月發(fā)布了由謝因波曼與克里斯威理斯兩位聯(lián)合提出的“We Me...
    胡多錢(qián)閱讀 1,628評(píng)論 0 1

友情鏈接更多精彩內(nèi)容