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碼依次對比的)