函數是什麼,大家都懂,就是一種特殊的映射,關係的表達式,在Python中有簡單的函數,在上一篇博文有簡單介紹,本篇將介紹高階函數,其實就是函數的嵌套(本人理解)以及匿名函數和返回函數!
map()和reduce()
- map()
首先我們看map()函數,它比較容易理解,它接收2個參數,一個是函數,一個是Iterable(一種對象類型,可迭代的對象,它裏面的元素可以一個個提取出來,如列表,元組等等!)map()裏的第一個參數就是函數,它會作用於Iterable裏的每一個元素!下面舉出實例:
def add(x):
return x*2
m = map(add,[1,2,3])
print(list(m)) #[2,4,6]此時輸出的是list型,也可以輸出其他的,大家隨意而已
print(tuple(m)) #(2,4,6)
- reduce()
接着,我們看reduce()函數,這個函數也是需要2個參數,一個是函數,一個也是一個序列,它和map()的不同之處在於它會一次接收處理2個參數,得到的結果和下一個參數做累積運算!看代碼!
from functools import reduce #它需要引入模塊
def add(x,y):
return x+y
m = reduce(add,[1,2,3]) #運算過程1+2得出3在加上3得出結果,就是一個滾雪球的過程!
print(n) #6
filter
filter()函數和前2個函數類似,需要2個參數,一個函數一個序列,它的作用是過濾序列!看代碼!
def fun(x):
return x%2 =0
m = filter(fun,[1,2,3,4,5,6])
print(list(m)) #[2,4,6] 這段代碼就是過濾奇數!
sorted()
sorted()函數我在前面的博文關於 list 的操作裏有簡單介紹!它是用來排序的函數!一般的排序只是比較元素大小,但是這種比較在字典這種類型的數據就無效了,此時必須通過函數抽象出來。呆子,看代碼!
sorted([1,5,2,6]) #[1,2,5,6]默認爲升序
sorted([1,3,-9,5],key=abs) #[1,3,5,-9] 此時,key後接一個函數,排序就按照函數的定義進行,顯然就是按照絕對值大小進行排序!
sorted(['a','b']) #['a','b']此時按照首字符的ASCLL的大小比較!
sorted([1,3,-9,5],key=abs,reverse=True) #[-9,5,3,1]此時按照key定義的函數進行排序,但是reverse=True表示反轉!
注:以上三種函數是高階函數且是Python的內置函數
匿名函數
匿名函數的提出就是爲了避免函數名衝突,不用顯式的定義函數,可以直接傳入匿名函數!其中,關鍵字lambda表示匿名函數。
tuple(map(lambda x:x+1,(1,2,3))) #(2,3,4)可以看出lambda的作用其實就是定義了一個函數實現加1的功能!
匿名函數也可以作爲一個函數對象賦給一個變量,再來調用!也可以作爲返回值!
m = lambda x:x+1
m(1) #2
def fun(x):
return lambda:x+1
返回函數
返回函數是將函數作爲返回值返回,也就是返回的不是要的結果,而是一個函數,要想得到結果就再次調用!
def fun(*args):
def add():
x = 0
for i in args:
x = x +i
return x
return add
在這個求和函數中,返回值就是add函數,但是但你調用函數時:
m = fun(1,2,3)
print(m) #會出現錯誤
print(m()) #6
之所以出現這種情況的原因是因爲當我們調用m時其實返回的是add函數,並不是最終的結果,只有在調用m()時纔是計算結果!大家腦補一下!
在返回函數中有閉包的概念,這個很重要!俺們看個實例解析!
def fun():
m = []
for i in range(1,3)
def add():
return i +1
m.append(add)
return m
n = fun()
printn((n()) #3
對於出現這個結果大家可能我起初也是詫異的!但是理解一番就OK了!在一個函數中定義了另一個函數,並且在內部函數中調用外部函數的參數或者變量,當我們返回函數時,相關的參數和變量仍然保存在返回的函數中,稱之爲閉包!
看我們這個程序,有2個循環,但是在調用n()時,返回函數沒有立刻執行,也就是說調用n()時,我們的程序之前只是執行到了add函數之外,循環剛剛結束之時,此時的 i 明顯就是2了,所以最終的結果是3!