1. 程式人生 > >Python基礎(9):高階函式(map,reduce,filter,sorted)

Python基礎(9):高階函式(map,reduce,filter,sorted)

高階函式

定義:一個函式,可以接收另一個函式作為引數,這種函式稱之為高階函式。

理論基礎: 

1:函式可以接收變數

2:函式名是指向函式的變數。

例如:abs,原本指向一個計算絕對值的函式,將他指向123後,abs變數就不再具有計算絕對值的能力。

map/reduce

map函式接收兩個引數,函式名和可迭代物件。旨在將函式作用於每一個值,並返回一個可迭代物件。

例如:利用map函式,將所有元素轉化為字串。返回一個map物件,轉化為列表後輸出。

reduce函式同樣需要接收兩個引數,函式名和序列。特點是將結果繼續和序列下一元素做累計運算。

可以表現為:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

filter

filter函式用於過濾序列。

filter接收兩個引數,函式名和序列。將函式分別作用於序列中的元素,根據返回值true或false決定決定保留還是丟棄該元素。

示例:利用埃氏篩法計算素數。(素數,除了1和它本身之外,沒有其他因數)

原理:

列出從2開始的所有自然數,構成一個序列。2,3,4,5,6,7,8,……

取第一個數,2,是素數。然後把序列中2的倍數篩除

取第一個數,3,是素數,然後把序列中3的倍數篩除

取第一個數,5,是素數,然後把序列中5的倍數篩除

不斷篩下去,就可以得到所有的素數。

程式碼分析:

首先我們需要一個序列。

明確需求:這個序列需要能表示從2開始的所有自然數。

理性分析:所有偶數,除2之外,均為合數。保留偶數,沒有必要。

最終方案:建立一個,從3開始的奇數序列。

def fun1():
    n=1
    while True:
        n=n+2
        yield n        #生成器是惰性演算法,適合表現無限序列

其次我們需要一個函式,這個函式的作用是:取序列的第一個元素,將其倍數全部刪除。

def fun2(n):                  #當呼叫形式為fun2((1),(2))時,表示n=1,x=2
    return lambda x:x%n>0     #匿名函式,後面講解,這一段的意思是,如果x整除n,餘數大於0,則返回Ture,否則返回False

接下來,需要寫一個最終的生成器,不斷返回下一個素數。

def fun3():
    yield 2
    it = fun1() # 初始序列
    while True:
        n = next(it) # 返回序列的第一個數
        yield n
        it = filter(fun2(n), it) # 構造新序列

除錯結果:

sorted

python內建的sorted函式可以進行排序。

但sorted也可以是一個高階函式,通過Key引數接收一個函式,進行自定義排序。

例項:

對字串排序,忽略大小寫。

sorted(['aaa', 'aab', 'AAA', 'AAB'], key=str.lower)

對比:(字串對比,是拿字元的ASCII碼依次對比的)