Python學(xué)習(xí)筆記二

今天看了函數(shù)式編程的內(nèi)容诫龙,需要記錄一下。

高階函數(shù)

map/reduce

  • map()函數(shù)
    它接受兩個(gè)參數(shù),一個(gè)函數(shù)歧焦,一個(gè)Iterable,這個(gè)函數(shù)會(huì)作用于Iterable的每個(gè)元素肚医,并把結(jié)果作為Iterator返回绢馍。
    比如:
>>> def f(x):
...     return x * x
...
>>> r = map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> list(r)
[1, 4, 9, 16, 25, 36, 49, 64, 81]

可見最后的結(jié)果是list中的每個(gè)元素都進(jìn)行平方運(yùn)算最后生成一個(gè)Iterator,然后用list方法進(jìn)行輸出肠套。

  • reduce()函數(shù)
    它接受兩個(gè)參數(shù)舰涌,一個(gè)函數(shù),一個(gè)序列你稚,用于把結(jié)果繼續(xù)和序列的下個(gè)元素做累積計(jì)算瓷耙。
    比如:
>>> from functools import reduce
>>> def fn(x, y):
...     return x * 10 + y
...
>>> reduce(fn, [1, 3, 5, 7, 9])
13579

list的前面兩個(gè)元素做出的結(jié)果繼續(xù)與后面的元素進(jìn)行運(yùn)算朱躺,以此類推。

filter

它也接受一個(gè)函數(shù)和一個(gè)序列作為參數(shù)搁痛,然后把傳入的函數(shù)作用于序列中的每個(gè)元素长搀,再根據(jù)返回的是True還是False決定保留或者刪去元素。
比如:

>>> def is_odd(n):
...   return n % 2 == 0
>>> list(filter(is_odd,[2,3,4,5,7,9,10]))
[2, 4, 10]

這個(gè)函數(shù)就可以保留偶數(shù)鸡典。

sorted

一般的排序用法源请。

>>> sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]

或者

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

可以用key來指定排序的關(guān)鍵字。
當(dāng)需要反向排序的時(shí)候可以這樣:

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

加上reverse方法即可彻况。

返回函數(shù)

  • 函數(shù)可以當(dāng)做結(jié)果值返回谁尸。
    比如這個(gè)求和函數(shù):
def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum
>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function lazy_sum.<locals>.sum at 0x101c6ed90>

我們發(fā)現(xiàn)調(diào)用后返回的是一個(gè)函數(shù)而不是值,之后再次進(jìn)行調(diào)用才可以纽甘。

>>> f()
25

當(dāng)程序修改后才回返回計(jì)算的值:

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum()
>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
25
  • 閉包
    這樣兩個(gè)函數(shù):
def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f())
    return fs

f1, f2, f3 = count()
print(f1,f2,f3)

輸出1 4 9

def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs

f1, f2, f3 = count()
print(f1(),f2(),f3())

輸出9 9 9
差別在哪里良蛮?
前者加入fs這個(gè)list的其實(shí)是經(jīng)過計(jì)算后的值,也就是1悍赢、4决瞳、9。那么count()調(diào)用后就已經(jīng)進(jìn)行了運(yùn)算泽裳,所以f1瞒斩、f2、f3就分別對(duì)應(yīng)的是list的三個(gè)值涮总。
后者加入list的其實(shí)是三個(gè)函數(shù)胸囱,都是計(jì)算i*i的函數(shù),也就是f1瀑梗、f2烹笔、f3這三個(gè)元素。只有最后調(diào)用的時(shí)候才產(chǎn)生結(jié)果抛丽,那么調(diào)用的時(shí)候i已經(jīng)是3了谤职,所以結(jié)果相同了都是9。

匿名函數(shù)

匿名函數(shù)用法:

>>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
[1, 4, 9, 16, 25, 36, 49, 64, 81]

lambda x: x * x就是匿名函數(shù)亿鲜。

裝飾器

在代碼運(yùn)行期間動(dòng)態(tài)增加功能的方式允蜈,稱為“裝飾器”。

  • 函數(shù)的名字
    函數(shù)對(duì)象有個(gè)name屬性蒿柳,可以拿到函數(shù)的名字饶套,比如:
>>> int.__name__
'int'
  • 要增強(qiáng)某個(gè)函數(shù)的功能,希望在調(diào)用前后打印日志垒探。
    比如:
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')

調(diào)用now()函數(shù):

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

發(fā)現(xiàn)進(jìn)行了日志輸出妓蛮。

偏函數(shù)

普通情況下,int會(huì)把字符串轉(zhuǎn)換為整數(shù)圾叼,比如:

>>> int('12345')
12345

但是int()函數(shù)還提供額外的base參數(shù)蛤克,比如:

>>> int('12345', base=8)
5349
>>> int('12345', 16)
74565

利用偏函數(shù):

>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2('1000000')
64
>>> int2('1010101')
85

這樣重新定義后的int2函數(shù)就可以把二進(jìn)制字符串轉(zhuǎn)化為十進(jìn)制數(shù)了捺癞。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市构挤,隨后出現(xiàn)的幾起案子髓介,更是在濱河造成了極大的恐慌,老刑警劉巖儿倒,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件版保,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡夫否,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門叫胁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來凰慈,“玉大人,你說我怎么就攤上這事驼鹅∥⑽剑” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵输钩,是天一觀的道長(zhǎng)豺型。 經(jīng)常有香客問我,道長(zhǎng)买乃,這世上最難降的妖魔是什么姻氨? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮剪验,結(jié)果婚禮上肴焊,老公的妹妹穿的比我還像新娘。我一直安慰自己功戚,他們只是感情好娶眷,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著啸臀,像睡著了一般届宠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上乘粒,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天豌注,我揣著相機(jī)與錄音,去河邊找鬼谓厘。 笑死幌羞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的竟稳。 我是一名探鬼主播属桦,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼熊痴,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了聂宾?” 一聲冷哼從身側(cè)響起果善,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎系谐,沒想到半個(gè)月后巾陕,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纪他,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年鄙煤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茶袒。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡梯刚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出薪寓,到底是詐尸還是另有隱情亡资,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布向叉,位于F島的核電站锥腻,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏母谎。R本人自食惡果不足惜瘦黑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望销睁。 院中可真熱鬧供璧,春花似錦、人聲如沸冻记。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽冗栗。三九已至演顾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間隅居,已是汗流浹背钠至。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留胎源,地道東北人棉钧。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像涕蚤,于是被迫代替她去往敵國(guó)和親宪卿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子的诵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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