Python高階函數(shù)

一個(gè)函數(shù)就可以接收另一個(gè)函數(shù)作為參數(shù)凯沪,這種函數(shù)就稱(chēng)之為高階函數(shù)第焰。

一、map著洼、reduce

map是內(nèi)置函數(shù)樟遣,reduce不是。身笤。豹悬。

map()

語(yǔ)法:map(func,list)
原理:map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])=[f(1), f(2), f(3), f(4), f(5), f(6), f(7), f(8), f(9) ]
map()傳入的第一個(gè)參數(shù)是f,即函數(shù)對(duì)象本身液荸。由于結(jié)果r是一個(gè)Iterator瞻佛,Iterator是惰性序列,因此通過(guò)list()函數(shù)讓它把整個(gè)序列都計(jì)算出來(lái)并返回一個(gè)list娇钱。

>>> 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]

reduce()

語(yǔ)法:reduce(func,list)
原理:reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

# str轉(zhuǎn)int
>>> from functools import reduce
>>> def fn(x, y):
...     return x * 10 + y
...
>>> def char2num(s):
...     digits = {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}
...     return digits[s]
...
>>> reduce(fn, map(char2num, '13579'))
13579

二伤柄、filter

filter()的作用是從一個(gè)序列中篩出符合條件的元素。由于filter()使用了惰性計(jì)算文搂,所以只有在取filter()結(jié)果的時(shí)候适刀,才會(huì)真正篩選并每次返回下一個(gè)篩出的元素。

# 把一個(gè)序列中的空字符串刪掉煤蹭,可以這么寫(xiě):

def not_empty(s):
    return s and s.strip()

list(filter(not_empty, ['A', '', 'B', None, 'C', '  ']))
# 結(jié)果: ['A', 'B', 'C']

三笔喉、sorted()

sorted()也是一個(gè)高階函數(shù)取视。用sorted()排序的關(guān)鍵在于實(shí)現(xiàn)一個(gè)映射函數(shù)。
語(yǔ)法:sorted(list, key=func, , reverse=True/false)

# 默認(rèn)排序
>>> sorted([36, 5, -12, 9, -21])
[-21, -12, 5, 9, 36]
# 指定排序方式 key
sorted([36, 5, -12, 9, -21], key=abs)
[5, 9, -12, -21, 36]
# 倒序 reverse
>>> sorted(['bob', 'about', 'Zoo', 'Credit'], key=str.lower, reverse=True)
['Zoo', 'Credit', 'bob', 'about']

四常挚、返回函數(shù)(閉包)

python不僅可以將函數(shù)作為另一個(gè)函數(shù)的參數(shù)作谭,也可以調(diào)用一個(gè)函數(shù),返回另一個(gè)函數(shù)奄毡。稱(chēng)為閉包

def createCounter():
    n = [0]
    def counter():
        while True:
            n[0] = n[0]+1
            return n[0]
    return counter
# 測(cè)試:
counterA = createCounter()
print(counterA(), counterA(), counterA(), counterA(), counterA()) # 1 2 3 4 5
counterB = createCounter()
if [counterB(), counterB(), counterB(), counterB()] == [1, 2, 3, 4]:
    print('測(cè)試閉包通過(guò)!')
else:
    print('測(cè)試閉包失敗!')    

閉包初始理解有難度折欠,目前理解為:(可能有誤)
counterA = createCounter()此步驟可理解為:createCounter()函數(shù)創(chuàng)建了list n=[0],并將counter()函數(shù)賦值給counterA。每次執(zhí)行counterA()方法時(shí)吼过,會(huì)通過(guò)counter()改變n(閉包外部變量)的值锐秦。
此時(shí)再調(diào)用counterB = createCounter(),會(huì)重新創(chuàng)建list n=[0]那先,并重新創(chuàng)建方法counter()賦值給counterB

五农猬、匿名函數(shù)(lambda)

>>> f = lambda x: x * x
>>> f
<function <lambda> at 0x101c6ef28>
>>> f(5)
25

六、裝飾器(lambda)

在函數(shù)調(diào)用前后自動(dòng)打印日志售淡,但又不希望修改函數(shù)的定義,這種在代碼運(yùn)行期間動(dòng)態(tài)增加功能的方式慷垮,稱(chēng)之為“裝飾器”(Decorator)揖闸。

不帶參數(shù)的裝飾器

# 聲明裝飾器
import functools

def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):
        print('call %s():' % func.__name__)
        return func(*args, **kw)
    return wrapper

# 使用裝飾器
@log
def now():
    print('2015-3-25')
# 執(zhí)行結(jié)果如下:
>>> now()
call now():
2015-3-25

把@log放到now()函數(shù)的定義處,相當(dāng)于執(zhí)行了語(yǔ)句:now = log(now)

不帶參數(shù)的裝飾器

# 聲明裝飾器
import functools

def log(text):
    def decorator(func):
        @functools.wraps(func)
        def wrapper(*args, **kw):
            print('%s %s():' % (text, func.__name__))
            return func(*args, **kw)
        return wrapper
    return decorator

# 使用裝飾器
@log('execute')
def now():
    print('2015-3-25')
# 執(zhí)行結(jié)果如下:
>>> now()
execute now():
2015-3-25

和兩層嵌套的decorator相比料身,3層嵌套的效果是這樣的: now = log('execute')(now)
@functools.wraps(func)
def wrapper(*args, **kw): 的作用是將func的屬性(比如:name)賦給wrapper

七汤纸、偏函數(shù)

functools.partial的作用就是,把一個(gè)函數(shù)的某些參數(shù)給固定浊垩(也就是設(shè)置默認(rèn)值)贮泞,返回一個(gè)新的函數(shù),調(diào)用這個(gè)新函數(shù)會(huì)更簡(jiǎn)單幔烛。
例如
int(str, base=10)此方法默認(rèn)的進(jìn)制是10進(jìn)制啃擦,而我們要使用2進(jìn)制

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

最后,創(chuàng)建偏函數(shù)時(shí)饿悬,實(shí)際上可以接收函數(shù)對(duì)象令蛉、args和*kw這3個(gè)參數(shù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市狡恬,隨后出現(xiàn)的幾起案子珠叔,更是在濱河造成了極大的恐慌,老刑警劉巖弟劲,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祷安,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡兔乞,警方通過(guò)查閱死者的電腦和手機(jī)汇鞭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)凉唐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人虱咧,你說(shuō)我怎么就攤上這事熊榛。” “怎么了腕巡?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵玄坦,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我绘沉,道長(zhǎng)煎楣,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任车伞,我火速辦了婚禮择懂,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘另玖。我一直安慰自己困曙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布谦去。 她就那樣靜靜地躺著慷丽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鳄哭。 梳的紋絲不亂的頭發(fā)上要糊,一...
    開(kāi)封第一講書(shū)人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音妆丘,去河邊找鬼锄俄。 笑死,一個(gè)胖子當(dāng)著我的面吹牛勺拣,可吹牛的內(nèi)容都是我干的奶赠。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼宣脉,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼车柠!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起塑猖,我...
    開(kāi)封第一講書(shū)人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤竹祷,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后羊苟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體塑陵,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年蜡励,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了令花。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阻桅。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖兼都,靈堂內(nèi)的尸體忽然破棺而出嫂沉,到底是詐尸還是另有隱情,我是刑警寧澤扮碧,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布趟章,位于F島的核電站,受9級(jí)特大地震影響慎王,放射性物質(zhì)發(fā)生泄漏蚓土。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一赖淤、第九天 我趴在偏房一處隱蔽的房頂上張望蜀漆。 院中可真熱鬧,春花似錦咱旱、人聲如沸确丢。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蠕嫁。三九已至,卻和暖如春毯盈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背病袄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工搂赋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人益缠。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓脑奠,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親幅慌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子宋欺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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

  • First Class Object函數(shù)在Python中是一等公民,函數(shù)也是對(duì)象胰伍,可調(diào)用的對(duì)象齿诞,函數(shù)可以作為普通變...
    RussellYoung閱讀 600評(píng)論 0 1
  • 一、高階函數(shù) 1.map() 代碼演示:"""map(function,iterable)function:函數(shù)i...
    hollow_02f9閱讀 350評(píng)論 0 0
  • 本文要點(diǎn) 1.什么是高階函數(shù) 2.python中有哪些常用的高階函數(shù) 什么是高階函數(shù)骂租? 在了解什么是高階函數(shù)之前祷杈,...
    GoPython閱讀 394評(píng)論 0 2
  • 函數(shù)式編程咯的一個(gè)特點(diǎn)就是,允許把函數(shù)本身作為參數(shù)傳入另一個(gè)函數(shù)渗饮,還允許返回一個(gè)函數(shù)但汞! 變量可以指向函數(shù)宿刮,可通過(guò)該...
    某米狼閱讀 548評(píng)論 0 1
  • 如何提升我們睡眠質(zhì)量? 缺乏深度睡眠會(huì)出現(xiàn)犯困私蕾,怎樣才能提高我們的睡眠質(zhì)量僵缺,我們可以從以下幾個(gè)方面,1跟具體嗎踩叭?體...
    洛可可_6b44閱讀 159評(píng)論 0 0