Python的filter(),map(),reduce(),sorted()及裝飾器

filter()

回?cái)?shù)是指從左向右讀和從右向左讀都是一樣的數(shù)家坎,例如12321,909兴猩。請(qǐng)利用filter()濾掉非回?cái)?shù):

def is_palindrome(n):
    return str(n)[::-1]==str(n)    //這里利用切片來逆序str

output = filter(is_palindrome, range(1, 100))
print(list(output))

結(jié)果:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99]

和map()類似期吓,filter()也接收一個(gè)函數(shù)和一個(gè)序列。和map()不同的是,filter()把傳入的函數(shù)依次作用于每個(gè)元素讨勤,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素箭跳。

map()

map()函數(shù)接收兩個(gè)參數(shù),一個(gè)是函數(shù)潭千,一個(gè)是Iterable谱姓,map將傳入的函數(shù)依次作用到序列的每個(gè)元素,并把結(jié)果作為新的Iterator返回刨晴。

reduce()

reduce把一個(gè)函數(shù)作用在一個(gè)序列[x1, x2, x3, ...]上屉来,這個(gè)函數(shù)必須接收兩個(gè)參數(shù),reduce把結(jié)果繼續(xù)和序列的下一個(gè)元素做累積計(jì)算狈癞,其效果就是

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

下面就是把一個(gè)str類型的小數(shù)化成folat類型的小數(shù)茄靠。
****ord()****是取得ASCII碼
****pow()****是冪運(yùn)算

from functools import reduce

def str2int(s):
    return reduce(lambda x, y: x * 10 + y, map(lambda x : ord(x)-ord('0'), s))

def str2float(s):
    return str2int(s.replace('.',''))/pow(10,len(s.split('.')[1]))

print('str2float(\'1233.4356\') =', str2float('1233.4356'))

sort()

sorted()可以直接對(duì)list排序。
也可以接收一個(gè)key函數(shù)來實(shí)現(xiàn)自定義的排序蝶桶,比如按絕對(duì)值大小

sorted([36, 5, -12, 9, -21], key=abs)

這里的方法是先按照函數(shù)計(jì)算返回值來排序慨绳,然后對(duì)應(yīng)到原來的list元素上。
如果要反向排序真竖,就在后面再加上一個(gè)參數(shù)

sorted([36, 5, -12, 9, -21], key=abs,reverse = True)

裝飾器

關(guān)于裝飾器這個(gè)問題脐雪。要先了解一個(gè)返回函數(shù)的概念

函數(shù)作為返回值
高階函數(shù)除了可以接受函數(shù)作為參數(shù)外,還可以把函數(shù)作為結(jié)果值返回恢共。
我們來實(shí)現(xiàn)一個(gè)可變參數(shù)的求和战秋。通常情況下,求和的函數(shù)是這樣定義的:

def calc_sum(*args):
    ax = 0
    for n in args:
        ax = ax + n
    return ax

但是讨韭,如果不需要立刻求和脂信,而是在后面的代碼中,根據(jù)需要再計(jì)算怎么辦拐袜?可以不返回求和的結(jié)果吉嚣,而是返回求和的函數(shù):

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

當(dāng)我們調(diào)用lazy_sum()時(shí),返回的并不是求和結(jié)果蹬铺,而是求和函數(shù):

>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>

調(diào)用函數(shù)f時(shí)尝哆,才真正計(jì)算求和的結(jié)果:

>>> f()
25

然后我們?cè)賮砜囱b飾器

def log(func):
    def wrapper(*args,**kw):
        print('call %s' % func.__name__)
        return func(*args,**kw)
    return wrapper
@log
def now():
    print('2015-3-25')

運(yùn)行結(jié)果

>>> now()
call now():
2015-3-25

把@log放到now()函數(shù)的定義處,相當(dāng)于執(zhí)行了語句:
now = log(now)
也就是說,now現(xiàn)在指向的是運(yùn)行l(wèi)og(now)之后的返回函數(shù)wrapper甜攀。原本的now函數(shù)現(xiàn)在作為參數(shù)func存在于Log函數(shù)里秋泄。
接著底下調(diào)用now(),也就是調(diào)用wrapper()函數(shù)。這個(gè)函數(shù)的內(nèi)容是
輸出‘ call now(): ’
運(yùn)行now()的結(jié)果作為返回规阀。

如果log也帶參數(shù)恒序,那么把@log('execute')放到now()函數(shù)的定義處,相當(dāng)于執(zhí)行了語句:
now = log('execute')(now)

思考一下能否寫出一個(gè)@log的decorator谁撼,使它既支持:
@log
又支持:
@log('execute')

import functools

def log(text):
    def decorate(func):
        @functools.wraps(func)
        def wrapper(*args,**kws):
            print('%s %s' %(text,func.__name__))
            func(*args,**kws)      
        return wrapper
    if(isinstance(text,str)):
        return decorate
    else:
        fuc = text
        text = ''
        return decorate(fuc)
    
@log ('essdf')               # now = log(now)   now = log('execute')(now)
def now():
    print('2015-3-25')
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末歧胁,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌喊巍,老刑警劉巖屠缭,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異崭参,居然都是意外死亡呵曹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門何暮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奄喂,“玉大人,你說我怎么就攤上這事海洼】缧拢” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵贰军,是天一觀的道長玻蝌。 經(jīng)常有香客問我,道長词疼,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任帘腹,我火速辦了婚禮贰盗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘阳欲。我一直安慰自己舵盈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布球化。 她就那樣靜靜地躺著秽晚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪筒愚。 梳的紋絲不亂的頭發(fā)上赴蝇,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音巢掺,去河邊找鬼句伶。 笑死,一個(gè)胖子當(dāng)著我的面吹牛陆淀,可吹牛的內(nèi)容都是我干的考余。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼轧苫,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼楚堤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤身冬,失蹤者是張志新(化名)和其女友劉穎衅胀,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體吏恭,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拗小,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了樱哼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哀九。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖搅幅,靈堂內(nèi)的尸體忽然破棺而出阅束,到底是詐尸還是另有隱情,我是刑警寧澤茄唐,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布息裸,位于F島的核電站,受9級(jí)特大地震影響沪编,放射性物質(zhì)發(fā)生泄漏呼盆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一蚁廓、第九天 我趴在偏房一處隱蔽的房頂上張望访圃。 院中可真熱鬧,春花似錦相嵌、人聲如沸腿时。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽批糟。三九已至,卻和暖如春看铆,著一層夾襖步出監(jiān)牢的瞬間徽鼎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工性湿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留纬傲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓肤频,卻偏偏與公主長得像叹括,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宵荒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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

  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語閱讀 3,629評(píng)論 0 7
  • 函數(shù)式編程就是一種抽象程度很高的編程范式汁雷,純粹的函數(shù)式編程語言編寫的函數(shù)沒有變量净嘀,因此,任意一個(gè)函數(shù)侠讯,只要輸入是確...
    齊天大圣李圣杰閱讀 1,525評(píng)論 0 2
  • 函數(shù)作為返回值 高階函數(shù)除了可以接受函數(shù)作為參數(shù)外挖藏,還可以把函數(shù)作為結(jié)果值返回。 我們來實(shí)現(xiàn)一個(gè)可變參數(shù)的求和厢漩。通...
    喵在野閱讀 285評(píng)論 0 1
  • Python進(jìn)階框架 希望大家喜歡膜眠,點(diǎn)贊哦首先感謝廖雪峰老師對(duì)于該課程的講解 一、函數(shù)式編程 1.1 函數(shù)式編程簡...
    Gaolex閱讀 5,493評(píng)論 6 53
  • 上一章:原來愛上你(二十三):灰姑娘的銳變 原來愛上你目錄 與康偉溜嗜,許小白這邊熱鬧的會(huì)場(chǎng)氛圍相比宵膨,劉建在楊氏集團(tuán)召...
    洋阿洋閱讀 348評(píng)論 0 1