functools

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

[TOC]

cmp_to_key

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

Help on function cmp_to_key in module functools:

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

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

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

    py3中取消了cmp函數(shù) 而這個函數(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則返回一個負(fù)數(shù);如果z>y則返回一個正數(shù);如果x==y則返回0

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

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

    • 因為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.
        
        
    • 很簡單 在py2設(shè)計過一個cmp函數(shù)了,但是到py3不能用了怎么辦?用functools.cmp_to_key啊:
      1. 對序列 a=range(10)進(jìn)行排序
      2. 首先定義一個比較函數(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 排序的時候直接用cmp參數(shù)
        >>> sorted(a, cmp=cmp_func)
        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
        
      4. py3沒有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.

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

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


## functools.total_ordering

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

@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)用場景是固定一個函數(shù)的某些參數(shù)

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

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

但是我們也可以直接簡單生成

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

partialmethod

類似于 partial 但是 只有 partialmethod才能作用于方法

lru_cache

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

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

update_wrapper

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

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

wraps

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

singledispatch

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末渠缕,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子褒繁,更是在濱河造成了極大的恐慌亦鳞,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棒坏,死亡現(xiàn)場離奇詭異燕差,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)坝冕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門徒探,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人喂窟,你說我怎么就攤上這事测暗。” “怎么了磨澡?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵碗啄,是天一觀的道長。 經(jīng)常有香客問我钱贯,道長挫掏,這世上最難降的妖魔是什么侦另? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任秩命,我火速辦了婚禮尉共,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弃锐。我一直安慰自己袄友,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布霹菊。 她就那樣靜靜地躺著剧蚣,像睡著了一般。 火紅的嫁衣襯著肌膚如雪旋廷。 梳的紋絲不亂的頭發(fā)上鸠按,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機(jī)與錄音饶碘,去河邊找鬼目尖。 笑死,一個胖子當(dāng)著我的面吹牛扎运,可吹牛的內(nèi)容都是我干的瑟曲。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼豪治,長吁一口氣:“原來是場噩夢啊……” “哼洞拨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起负拟,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤烦衣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后齿椅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體琉挖,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年涣脚,在試婚紗的時候發(fā)現(xiàn)自己被綠了示辈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡遣蚀,死狀恐怖矾麻,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情芭梯,我是刑警寧澤险耀,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站玖喘,受9級特大地震影響甩牺,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜累奈,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一贬派、第九天 我趴在偏房一處隱蔽的房頂上張望急但。 院中可真熱鬧,春花似錦搞乏、人聲如沸波桩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镐躲。三九已至,卻和暖如春侍筛,著一層夾襖步出監(jiān)牢的瞬間萤皂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工匣椰, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留敌蚜,地道東北人。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓窝爪,卻偏偏與公主長得像弛车,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蒲每,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容

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