Python函數(shù)式編程

函數(shù)是編程是一種抽象程度很高的編程范式。特點(diǎn)之一是允許將函數(shù)本身作為參數(shù)傳入另一個(gè)函數(shù)。并且允許返回一個(gè)函數(shù)。

1 高階函數(shù)

變量可以指向的函數(shù)

f = abs
其中abs為一個(gè)函數(shù),即變量f指向abs本身。

函數(shù)名也是變量

abs()是函數(shù),abs其實(shí)是一個(gè)指向該函數(shù)的變量。
ps:abs定義在__builtin__模塊中。

傳入函數(shù)

函數(shù)的參數(shù)可以接受變量,那么也可以接受其實(shí)是變量的函數(shù)名。

>>>def add(x, y, f):
          return f(x) + f(y)
>>>add(-9, 6, abs)
15

實(shí)際上就是abs(-9) + abs(6)的過程。

總結(jié):把函數(shù)作為參數(shù)傳入,這樣的函數(shù)就是高階函數(shù)。

2 map() / reduce()

map()

接受兩個(gè)參數(shù):函數(shù)與序列。
map(f, [ something ])
map(str, [1, 2, 3, 4, 5, 6]) ==> ['1', '2', '3', '4', '5', '6']
實(shí)際上map()是把計(jì)算過程抽象化了。

reduce()

接收兩個(gè)參數(shù):函數(shù)和序列。
與map()不同的是,reduce將接收到的函數(shù)作用在序列的每一個(gè)元素上并將其累計(jì)計(jì)算。

>>> def fn(x, y):
       return x * 10 + y
>>> reduce(fn, [1, 3, 5, 7, 9])
13579

3 filter()

filter()接收一個(gè)函數(shù)和一個(gè)序列。
它將傳入的函數(shù)依次作用于每個(gè)元素,然后根據(jù)返回值決定保留或是丟棄。
例:找1~100之間的素?cái)?shù)

def is_prime(n):
    if n == 1:
        return True
    else:
        for i in range(2, n-1):
            if n % i == 0:
                return False
    return True
print filter(is_prime, range(1, 101))

結(jié)果:[1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]

4 sorted()

排序算法
通常規(guī)定,對(duì)于兩個(gè)元素x和y,如果認(rèn)為x < y,則返回-1,如果認(rèn)為x == y,則返回0,如果認(rèn)為x > y,則返回1,這樣,排序算法就不用關(guān)心具體的比較過程,而是根據(jù)比較結(jié)果直接排序。

>>> sorted([36, 5, 12, 9, 21])
[5, 9, 12, 21, 36]
def reversed_cmp(x, y):
    if x > y:
        return -1
    if x < y:
        return 1
    return 0

傳入自定義的比較函數(shù)reversed_cmp,就可以實(shí)現(xiàn)倒序排序:

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

5 返回函數(shù)

函數(shù)作為返回值
def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

每次返回的函數(shù)都是新的。

閉包

返回函數(shù)不要應(yīng)用任何循環(huán)變量,或是后續(xù)會(huì)發(fā)生變化的變量。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容