- 首頁(yè)|
- 網(wǎng)校|
- 焚題庫(kù)|
- APP |
-
微信公眾號(hào)
初次了解的小伙伴可能有些疑惑,對(duì)于“高階”不明白,或者高階函數(shù)和函數(shù)兩者之間有什么關(guān)系?要怎么使用呢?有這些疑惑的小伙伴可以看下面內(nèi)容~
舉一個(gè)最簡(jiǎn)單的高階函數(shù)
def foo(x, y, f): # f 是一個(gè)函數(shù)
"""
把 x, y 分別作為參數(shù)傳遞給 f, 最后返回他們的和
:param x:
:param y:
:param f:
:return:
"""
return f(x) + f(y)
def foo1(x):
"""
返回參數(shù)的 x 的 3次方
:param x:
:return:
"""
return x ** 3
r = foo(4, 2, foo1)
print(r) # 72
說(shuō)明:
1、這里的 foo 就是高階函數(shù), 因?yàn)樗邮樟艘粋(gè)函數(shù)作為參數(shù).
2、foo1作為參數(shù)傳遞給了foo, 而且foo中的局部變量f接收了foo傳遞過(guò)來(lái)的數(shù)據(jù), 那么最終是foo和f同時(shí)指向了同一個(gè)對(duì)象。
總結(jié)
編寫(xiě)高階函數(shù),就是讓函數(shù)的參數(shù)能夠接收其他的函數(shù)。
把函數(shù)作為參數(shù)傳入,這樣的函數(shù)稱為高階函數(shù),函數(shù)式編程就是指這種高度抽象的編程范式。
高階函數(shù)另一種形式:把函數(shù)作為返回值
高階函數(shù)除了可以接受函數(shù)作為參數(shù)外,還可以把函數(shù)作為結(jié)果值返回。
def foo():
x = 10
def temp():
nonlocal x
x += 10 #x=x+10
return x
return temp
f = foo()
print(f())
print(f())
輸出結(jié)果:
說(shuō)明:
調(diào)用foo()得到的一個(gè)函數(shù), 然后把函數(shù)賦值給變量f, 這個(gè)時(shí)候f和 foo內(nèi)部的temp其實(shí)指向了同一個(gè)函數(shù)對(duì)象。
返回的函數(shù)每調(diào)用一次都會(huì)把foo 的局部變量x增加 10 .所以兩次調(diào)用分別得到 20 和 30。
返回訪問(wèn)了外部函數(shù)的局部變量或者全局變量的函數(shù),這種函數(shù)就是閉包。
內(nèi)置高階函數(shù)
高階函數(shù)在函數(shù)式編程語(yǔ)言中使用非常的廣泛。
本節(jié)簡(jiǎn)單介紹幾個(gè)常用的高階函數(shù)。
列表的排序, map/reduce, filter等。
map()和filter()
函數(shù)編程語(yǔ)言通常都會(huì)提供map, filter, reduce三個(gè)高階函數(shù).
在python3中, map和filter仍然是內(nèi)置函數(shù), 但是由于引入了列表推導(dǎo)和生成器表達(dá)式, 他們變得沒(méi)有那么重要了。
列表推導(dǎo)和生成器表達(dá)式具有了map和filter兩個(gè)函數(shù)的功能, 而且更易于閱讀。
代碼展示:
a = map(lambda x: x ** 2, [10, 20, 30, 40])
print(list(a))
print(type(a))
輸出結(jié)果:
說(shuō)明:
1、map函數(shù)是利用已有的函數(shù)和可迭代對(duì)象生成一個(gè)新的可迭代類型:map類型。
2、map的參數(shù)1是一個(gè)函數(shù), 參數(shù)2是一個(gè)可迭代類型的數(shù)據(jù). map會(huì)獲取迭代類型的每個(gè)數(shù)據(jù), 傳遞給參數(shù)1的函數(shù), 然后函數(shù)的返回值組成新的迭代類型的每個(gè)元素。
3、也可以有多個(gè)迭代器, 則參數(shù)1的函數(shù)的參數(shù)個(gè)數(shù)也會(huì)增加。
4、新生成的迭代器類型的元素的個(gè)數(shù), 會(huì)和最短的那個(gè)迭代器的元素的個(gè)數(shù)保持一致。
a = map(lambda x, y: x + y, [10, 20, 30, 40], [100, 200])
print(list(a))
輸出結(jié)果:
使用列表推倒實(shí)現(xiàn)上面的功能
使用列表比map優(yōu)雅了很多, 而且也避免了參數(shù)1的函數(shù)
list1 = [10, 20, 30, 40]
list3 = [x ** 2 for x in list1]
print(list3)
輸出結(jié)果:
list1 = [10, 20, 30, 40]
list2 = [100, 200]
# 注意:列表推倒中這里是使用的笛卡爾積
list3 = [x + y for x in list1 for y in list2]
print(list3)
輸出結(jié)果:
初級(jí)會(huì)計(jì)職稱中級(jí)會(huì)計(jì)職稱經(jīng)濟(jì)師注冊(cè)會(huì)計(jì)師證券從業(yè)銀行從業(yè)會(huì)計(jì)實(shí)操統(tǒng)計(jì)師審計(jì)師高級(jí)會(huì)計(jì)師基金從業(yè)資格稅務(wù)師資產(chǎn)評(píng)估師國(guó)際內(nèi)審師ACCA/CAT價(jià)格鑒證師統(tǒng)計(jì)資格從業(yè)
一級(jí)建造師二級(jí)建造師消防工程師造價(jià)工程師土建職稱房地產(chǎn)經(jīng)紀(jì)人公路檢測(cè)工程師建筑八大員注冊(cè)建筑師二級(jí)造價(jià)師監(jiān)理工程師咨詢工程師房地產(chǎn)估價(jià)師 城鄉(xiāng)規(guī)劃師結(jié)構(gòu)工程師巖土工程師安全工程師設(shè)備監(jiān)理師環(huán)境影響評(píng)價(jià)土地登記代理公路造價(jià)師公路監(jiān)理師化工工程師暖通工程師給排水工程師計(jì)量工程師
人力資源考試教師資格考試出版專業(yè)資格健康管理師導(dǎo)游考試社會(huì)工作者司法考試職稱計(jì)算機(jī)營(yíng)養(yǎng)師心理咨詢師育嬰師事業(yè)單位教師招聘公務(wù)員公選考試招警考試選調(diào)生村官
執(zhí)業(yè)藥師執(zhí)業(yè)醫(yī)師衛(wèi)生資格考試衛(wèi)生高級(jí)職稱護(hù)士資格證初級(jí)護(hù)師主管護(hù)師住院醫(yī)師臨床執(zhí)業(yè)醫(yī)師臨床助理醫(yī)師中醫(yī)執(zhí)業(yè)醫(yī)師中醫(yī)助理醫(yī)師中西醫(yī)醫(yī)師中西醫(yī)助理口腔執(zhí)業(yè)醫(yī)師口腔助理醫(yī)師公共衛(wèi)生醫(yī)師公衛(wèi)助理醫(yī)師實(shí)踐技能內(nèi)科主治醫(yī)師外科主治醫(yī)師中醫(yī)內(nèi)科主治兒科主治醫(yī)師婦產(chǎn)科醫(yī)師西藥士/師中藥士/師臨床檢驗(yàn)技師臨床醫(yī)學(xué)理論中醫(yī)理論