2022-08-12 python函數(shù)式編程

本文引自極客時(shí)間:Python 核心技術(shù)與實(shí)戰(zhàn)10 | 簡約不簡單的匿名函數(shù) (geekbang.org)以及09 | 不可或缺的自定義函數(shù) (geekbang.org)

1. map()

map(function, iterable) 函數(shù),表示對 iterable 中的每個元素阴挣,都運(yùn)用 function 這個函數(shù),最后返回一個新的可遍歷的集合(map對象)流纹。
例如:對列表中的每個元素乘以2

list1 = [1,2,3,4,5] #創(chuàng)建一個集合
new_list = map(lambda x: x * 2, list1) #使用map函數(shù)和lambda表達(dá)式對list1每個元素乘以2
print('new_list的類型是:',type(new_list), '\n')
for i in new_list:
    print(i)

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

new_list的類型是: <class 'map'> 

2
4
6
8
10

2. filter()

filter(function, iterable) 函數(shù),它和 map 函數(shù)類似逢倍,function 同樣表示一個函數(shù)對象捧颅。filter() 函數(shù)表示對 iterable 中的每個元素,都使用 function 判斷较雕,并返回 True 或者 False,最后將返回 True 的元素組成一個新的可遍歷的集合(filter對象)挚币。
例如:返回列表中的偶數(shù)

bool_list = filter(lambda x: x % 2 == 0, list1) #返回列表list中的偶數(shù)
print('bool_list的類型是:',type(bool_list), '\n') 
for i in bool_list:
    print(i)

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

bool_list的類型是: <class 'filter'> 

2
4

3. reduce()

reduce(function, iterable) 函數(shù)亮蒋,對 iterable 中的每個元素以及上一次調(diào)用后的結(jié)果,運(yùn)用 function 進(jìn)行計(jì)算妆毕,所以最后返回的是一個單獨(dú)的數(shù)值慎玖,它通常用來對一個集合做一些累積操作。
例如:計(jì)算某個列表元素的乘積


4. lambda()

具體應(yīng)用見這里:2022-08-12 python暑期面試題目 - 簡書 (jianshu.com)

5.函數(shù)的參數(shù)列表tips

  • 默認(rèn)參數(shù)
    函數(shù)的參數(shù)可以設(shè)置默認(rèn)值笛粘,傳入其他值則將其覆蓋掉:
# 參數(shù)的默認(rèn)值
def sum(a = 1, b = 2):
    return a + b
print(sum()) #可以不傳入?yún)?shù)趁怔,函數(shù)采取默認(rèn)值計(jì)算
print(sum(2)) #傳入一個參數(shù)湿硝,覆蓋掉第一個默認(rèn)值
print(sum(2,3)) #傳入兩個參數(shù),覆蓋掉兩個默認(rèn)值

運(yùn)行結(jié)果如下:

3
4
5
  • 函數(shù)的調(diào)用順序
    在外部主程序調(diào)用某個函數(shù)時(shí)润努,必須保證該函數(shù)在前面已經(jīng)被定義关斜,不然會報(bào)錯:
fun2() #先執(zhí)行后定義
def fun2():
    print('fun2被調(diào)用\n')

報(bào)錯:

NameError                                 Traceback (most recent call last)
Input In [1], in <cell line: 1>()
----> 1 fun2()

NameError: name 'fun2' is not defined

但在函數(shù)內(nèi)部,函數(shù)間哪個聲明在前铺浇、哪個在后就無所謂痢畜,因?yàn)?def 是可執(zhí)行語句,函數(shù)在調(diào)用之前都不存在鳍侣,我們只需保證調(diào)用時(shí)丁稀,所需的函數(shù)都已經(jīng)聲明定義:

# 函數(shù)的互相調(diào)用
#fun2() 

def fun1():
    print('fun1函數(shù)被調(diào)用') #函數(shù)內(nèi)部調(diào)用另一個函數(shù)時(shí)只要后者被定義即可,順序不影響
    fun2()
    
    
def fun2():
    print('fun2函數(shù)被調(diào)用')
    
fun1() #這里主程序調(diào)用fun1()時(shí)仍需放在fun1()和fun2()之后倚聚,但fun1()里可先調(diào)用fun2()

運(yùn)行結(jié)果如下:

fun1函數(shù)被調(diào)用
fun2函數(shù)被調(diào)用
  • 函數(shù)的嵌套
    函數(shù)的嵌套便是在函數(shù)的內(nèi)部再定義函數(shù)线衫,以上面的fun1函數(shù)和fun2函數(shù)為例,要想主程序內(nèi)不能直接訪問fun2函數(shù)惑折,可將其定義放在fun1內(nèi)部桶雀,如下:
# 函數(shù)的嵌套
def fun1():
    print('fun1函數(shù)被調(diào)用\n')
    def fun2():
        print('fun2函數(shù)被調(diào)用\n')
    fun2()   # 在fun1()內(nèi)部調(diào)用fun2()

fun1()

運(yùn)行結(jié)果如下:

fun1函數(shù)被調(diào)用

fun2函數(shù)被調(diào)用
  • 函數(shù)變量作用域
    變量按照作用域分為全局變量與局部變量,全局變量在程序的任意位置均可訪問唬复,局部變量只能在函數(shù)體內(nèi)被訪問矗积。如下所示:
# 函數(shù)的作用域
# 函數(shù)的作用域
A = 2 # 全局變量
def fun3():
    a = 1; #局部變量
    print('函數(shù)內(nèi)訪問局部變量a: {}'.format(a))
    #global A
    #A = 3
    print('函數(shù)內(nèi)訪問全局變量A: {}'.format(A))

fun3()
print('函數(shù)外訪問全局變量A: {}'.format(A))
print('函數(shù)外訪問局部變量a: {}'.format(a))

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

函數(shù)內(nèi)訪問局部變量a: 1
函數(shù)內(nèi)訪問全局變量A: 2
函數(shù)外訪問全局變量A: 2
NameError: name 'a' is not defined

盡管能夠在函數(shù)內(nèi)部訪問全局變量,但要想在函數(shù)內(nèi)部修改全局變量必須先用關(guān)鍵字global聲明該全局變量敞咧,否則會報(bào)錯:

# 函數(shù)的作用域
A = 2 # 全局變量
def fun3():
    a = 1; #局部變量
    print('函數(shù)內(nèi)訪問局部變量a: {}'.format(a))
    print('函數(shù)內(nèi)訪問全局變量A: {}'.format(A))
    global A
    A = 3
    
fun3()
print('函數(shù)外訪問全局變量A: {}'.format(A))
#print('函數(shù)外訪問局部變量a: {}'.format(a))

上面程序會報(bào)錯棘捣,因?yàn)閷的全局聲明在其使用之后,如下:

name 'A' is used prior to global declaration

將聲明放在輸出語句前面:

# 函數(shù)的作用域
A = 2 # 全局變量
def fun3():
    a = 1; #局部變量
    print('函數(shù)內(nèi)訪問局部變量a: {}'.format(a))
    global A
    print('函數(shù)內(nèi)訪問全局變量A: {}'.format(A))
    A = 3
    
fun3()
print('函數(shù)外訪問全局變量A: {}'.format(A))
#print('函數(shù)外訪問局部變量a: {}'.format(a))

運(yùn)行結(jié)果如下:在函數(shù)外訪問的全局變量A已經(jīng)是被修改過的休建。

函數(shù)內(nèi)訪問局部變量a: 1
函數(shù)內(nèi)訪問全局變量A: 2
函數(shù)外訪問全局變量A: 3

在函數(shù)內(nèi)部定義與全局變量同名的局部變量會在函數(shù)體內(nèi)覆蓋掉此全局變量乍恐,但不影響其在其他地方的使用:

def fun4():
    A = 4 
    print('函數(shù)體內(nèi)A變量此時(shí)的值為: {}'.format(A))
fun4()
print('函數(shù)體外A變量此時(shí)的值為: {}'.format(A))

運(yùn)行結(jié)果如下,可以看到函數(shù)體內(nèi)輸出的A是被覆蓋后的值测砂,函數(shù)體外輸出的A仍是原值茵烈。

函數(shù)體內(nèi)A變量此時(shí)的值為: 4
函數(shù)體外A變量此時(shí)的值為: 3

類似地,嵌套函數(shù)中內(nèi)部函數(shù)可以訪問外部函數(shù)的變量砌些,但不能直接修改呜投。若要修改,需加nonlocal關(guān)鍵字:

# 函數(shù)的嵌套
def fun1():
    B = 3
    print('fun1函數(shù)被調(diào)用',B)
    def fun2():
        nonlocal B # 聲明這里的B就是外部函數(shù)的B
        print('fun2函數(shù)被調(diào)用',B)
        B = 4 # 修改外部函數(shù)的變量
            
    fun2()   # 在fun1()內(nèi)部調(diào)用fun2()
    print('被修改后的B: {}'.format(B))

fun1()

運(yùn)行結(jié)果如下:

fun1函數(shù)被調(diào)用 3
fun2函數(shù)被調(diào)用 3
被修改后的B: 4
  • 閉包
    閉包與嵌套函數(shù)類似存璃,但其外部函數(shù)的返回值是一個函數(shù)仑荐,這個函數(shù)在后續(xù)會被賦予變量執(zhí)行計(jì)算。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末纵东,一起剝皮案震驚了整個濱河市粘招,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌偎球,老刑警劉巖洒扎,帶你破解...
    沈念sama閱讀 212,185評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辑甜,死亡現(xiàn)場離奇詭異,居然都是意外死亡袍冷,警方通過查閱死者的電腦和手機(jī)磷醋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來难裆,“玉大人子檀,你說我怎么就攤上這事∧烁辏” “怎么了褂痰?”我有些...
    開封第一講書人閱讀 157,684評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長症虑。 經(jīng)常有香客問我缩歪,道長,這世上最難降的妖魔是什么谍憔? 我笑而不...
    開封第一講書人閱讀 56,564評論 1 284
  • 正文 為了忘掉前任匪蝙,我火速辦了婚禮,結(jié)果婚禮上习贫,老公的妹妹穿的比我還像新娘逛球。我一直安慰自己,他們只是感情好苫昌,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,681評論 6 386
  • 文/花漫 我一把揭開白布颤绕。 她就那樣靜靜地躺著,像睡著了一般祟身。 火紅的嫁衣襯著肌膚如雪奥务。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,874評論 1 290
  • 那天袜硫,我揣著相機(jī)與錄音氯葬,去河邊找鬼。 笑死婉陷,一個胖子當(dāng)著我的面吹牛帚称,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播憨攒,決...
    沈念sama閱讀 39,025評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼世杀,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了肝集?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,761評論 0 268
  • 序言:老撾萬榮一對情侶失蹤蛛壳,失蹤者是張志新(化名)和其女友劉穎杏瞻,沒想到半個月后所刀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,217評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捞挥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,545評論 2 327
  • 正文 我和宋清朗相戀三年浮创,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片砌函。...
    茶點(diǎn)故事閱讀 38,694評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡斩披,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出讹俊,到底是詐尸還是另有隱情垦沉,我是刑警寧澤,帶...
    沈念sama閱讀 34,351評論 4 332
  • 正文 年R本政府宣布仍劈,位于F島的核電站厕倍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏贩疙。R本人自食惡果不足惜讹弯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,988評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望这溅。 院中可真熱鬧组民,春花似錦、人聲如沸悲靴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽对竣。三九已至庇楞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間否纬,已是汗流浹背吕晌。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留临燃,地道東北人睛驳。 一個月前我還...
    沈念sama閱讀 46,427評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像膜廊,于是被迫代替她去往敵國和親乏沸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,580評論 2 349

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