1. 高階函數
高階函數就是把函數當成參數傳遞的一種函數
舉例:
def add(x, y, f):
return f(x) + f(y)
print (add(-8, 11, abs))
返回結果:
19
① map() 函數
map() 函數接收兩個參數,一個是函數,一個是序列,map將傳入的函數依次作用到序列的每個元素,並把結果作爲新的list返回。
舉例:
lst = [1, 2, 3, 4, 5, 6, 7, 8, 9]
def f(x):
return x * x
map(f, lst)
[1, 4, 9, 16, 25, 36, 49, 64, 81]
map(str, lst)
['1', '2', '3', '4', '5', '6', '7', '8', '9']
註釋:
map()傳入的第一個參數是f,即函數對象本身
② reduce() 函數
reduce把一個函數作用在一個序列[x1, x2, x3...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算。
格式:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
#傳入的函數必須接受兩個參數;
#把可迭代對象的前兩個參數作爲函數的實參,傳入到f函數中;
#把每次f運算的結果作爲第一個實參,可迭代對象的下一個元素作爲另一個實參,傳入函數f中;
#以此類推,最終得到結果。
舉例:
def add(x, y):
return x + y
reduce(add, [1, 3, 5, 7, 9])
結果:
25
③ filter() 函數
Python內建的filter()函數用於過濾序列。
和map()類似,filter()也接收一個函數和一個序列。和map()不同的時,filter()把傳入的函數依次作用於每個元素,然後根據返回值是True還是False決定保留還是丟棄該元素。
例1,在一個list中,刪掉偶數,只保留奇數:
def is_odd(n):
return n % 2 == 1
filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
結果:
[1, 5, 9, 15]
例2,把一個序列中的空字符串刪掉:
def not_empty(s):
return s and s.strip()
filter(not_empty, ['A', '', 'B', None, 'C', ' '])
結果:
['A', 'B', 'C']
④ sorted() 函數
排序算法
排序也是在程序中經常用到的算法。無論使用冒泡排序還是快速排序,排序的核心是比較兩個元素的大小。
通常規定,對於兩個元素x和y,如果認爲x < y,則返回-1,如果認爲x == y,則返回0,如果認爲x > y,則返回1,
這樣,排序算法就不用關心具體的比較過程,而是根據比較結果直接排序。
Python內置的sorted()函數
可以對list進行排序:
sorted([36, 5, 12, 9, 21])
[5, 9, 12, 21, 36]
可以對dict進行排序:
mm = dict( a=1, b=2, c=3, d=4)
print sorted(mm.itertiems(), key = lambda d:d[0], reverse = True)
此外,sorted()函數也是一個高階函數,它還可以接收一個比較函數來實現自定義的排序。
比如,如果要倒序排序,我們就可以自定義一個reversed_cmp函數:
def reversed_cmp(x, y):
if x > y:
return -1
if x < y:
return 1
return 0
傳入自定義的比較函數reversed_cmp,就可以實現倒序排序:
sorted([36, 5, 12, 9, 21], reversed_cmp)
[36, 21, 12, 9, 5]
我們再看一個字符串排序的例子:
sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']
默認情況下,對字符串排序,是按照ASCII的大小比較的,由於'Z' < 'a',結果,大寫字母Z會排在小寫字母a的前面。
現在,我們提出排序應該忽略大小寫,按照字母序排序。
要實現這個算法,不必對現有代碼大加改動,只要我們能定義出忽略大小寫的比較算法就可以:
def cmp_ignore_case(s1, s2):
u1 = s1.upper()
u2 = s2.upper()
if u1 < u2:
return -1
if u1 > u2:
return 1
return 0
忽略大小寫來比較兩個字符串,實際上就是先把字符串都變成大寫(或者都變成小寫),再比較。
這樣,我們給sorted傳入上述比較函數,即可實現忽略大小寫的排序:
sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)
結果:
['about', 'bob', 'Credit', 'Zoo']
從上述例子可以看出,高階函數的抽象能力是非常強大的,而且,核心代碼可以保持得非常簡潔。
2. 匿名函數
顧名思義---> 沒有名字的函數
形式1:
def sum(x, y):
return x+y
print (sum(4, 5))
形式2:
m = lambda x,y:x+y
print (m(4, 5))
形式1 和 形式2 結果一樣
補充學習網址:https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386819873910807d8c322ca74d269c9f80f747330a52000