Python基礎(chǔ)入門(mén)教程19:再說(shuō)函數(shù) 那些不得不知道的事兒
來(lái)源:
奇酷教育 發(fā)表于:
前面的課程中,我們已經(jīng)對(duì)函數(shù)有了簡(jiǎn)單的了解函數(shù)的聲明、函數(shù)的的調(diào)用、函數(shù)的參數(shù)以及返回值等等本節(jié)內(nèi)容主要對(duì)函數(shù)中的一些高級(jí)操作進(jìn)行
前面的課程中,我們已經(jīng)對(duì)函數(shù)有了簡(jiǎn)單的了解
函數(shù)的聲明、函數(shù)的的調(diào)用、函數(shù)的參數(shù)以及返回值等等
本節(jié)內(nèi)容主要對(duì)函數(shù)中的一些高級(jí)操作進(jìn)行講解,方便大家在項(xiàng)目操作過(guò)程中對(duì)函數(shù)的操作更加靈活一些
函數(shù)遞歸
函數(shù)變量賦值
參數(shù)中的函數(shù)
匿名函數(shù)
返回值中的函數(shù):閉包
偏函數(shù)
裝飾器
1. 函數(shù)遞歸
函數(shù)的遞歸,就是讓在函數(shù)的內(nèi)部調(diào)用函數(shù)自身的情況,這個(gè)函數(shù)就是遞歸函數(shù)。
遞歸函數(shù)其實(shí)是另外一種意義的循環(huán)
如:計(jì)算一個(gè)數(shù)字的階乘操作,將這個(gè)功能封裝成函數(shù)fact(num)
提示:階乘算法是按照小于等于當(dāng)前數(shù)字的自然數(shù)進(jìn)行乘法運(yùn)算
計(jì)算5的階乘:5 X 4 X 3 X 2 X1
計(jì)算n的階乘:n X (n - 1) X ... X 3 X 2 X 1
我們?cè)谥罢f(shuō)過(guò),遞歸就是另外一種特殊的循環(huán):函數(shù)級(jí)別的循環(huán)
所以遞歸函數(shù)也可以使用循環(huán)來(lái)進(jìn)行實(shí)現(xiàn)
但是循環(huán)的實(shí)現(xiàn)思路沒(méi)有遞歸清晰。
使用遞歸函數(shù)時(shí)一定需要注意:遞歸函數(shù)如果一旦執(zhí)行的層數(shù)過(guò)多就會(huì)導(dǎo)致內(nèi)存溢出程序崩潰。
有一種做法是將遞歸函數(shù)的返回值中,不要添加表達(dá)式,而是直接返回一個(gè)函數(shù),這樣的做法旨在進(jìn)行尾遞歸優(yōu)化,大家如果有興趣的話(huà)可以上網(wǎng)自行查詢(xún)一下;由于不同的解釋器對(duì)于函數(shù)遞歸執(zhí)行的不同的處理,所以遞歸的使用請(qǐng)慎重分析和操作。
2. 函數(shù)變量賦值
函數(shù),是一種操作行為
函數(shù)名稱(chēng),其實(shí)是這種操作行為賦值的變量
調(diào)用函數(shù),其實(shí)是通過(guò)這個(gè)賦值的變量加上一堆圓括號(hào)來(lái)進(jìn)行函數(shù)的執(zhí)行
既然函數(shù)名稱(chēng)只是一個(gè)變量,變量中存放了這樣的一個(gè)函數(shù)對(duì)象
我們就可以將函數(shù)賦值給另一個(gè)變量
3. 參數(shù)中的函數(shù)
函數(shù)作為一個(gè)對(duì)象,我們同樣可以將函數(shù)當(dāng)成一個(gè)實(shí)際參數(shù)傳遞給另一個(gè)函數(shù)進(jìn)行處理、
4. 匿名函數(shù)
5. 返回值中的函數(shù):閉包
函數(shù)作為對(duì)象,同樣也可以出現(xiàn)在返回值中,其實(shí)就是在函數(shù)中又定義了另外的函數(shù)
在一個(gè)函數(shù)中定義并使用其他的函數(shù),這樣的方式在不同的編程語(yǔ)言中有不同的管理方式,在Python中,這樣的方式也成為閉包。
6. 偏函數(shù)
常規(guī)函數(shù)操作中,我們?cè)诤瘮?shù)的參數(shù)中可以添加參數(shù)的默認(rèn)值來(lái)簡(jiǎn)化函數(shù)的操作,偏函數(shù)也可以做到這一點(diǎn),偏函數(shù)可以在一定程度上更加方便的管理我們的函數(shù)操作
偏函數(shù)通過(guò)內(nèi)置模塊functools的partial()函數(shù)進(jìn)行定義和處理