我們先要了解一下什么是所謂的高階函數;
看定義:什么是高階函數?
高階函數:我們知道一個函數可以作為參數傳給另外一個函數,或者一個函數的返回值為另外一個函數(若返回值為該函數本身,則為遞歸),如果滿足其一,則為高階函數。
常見的高階函數:map()、reduce()、filter()等也是python內置的函數,也可以自定義高階函數,其實裝飾器也算一種高階函數通過這些介紹應該能對高階函數有一個詳細的了解;
首先來看看函數作為入參的高階函數:
def sonfunc(): print("in the sonfunc..") def highfunc(func): func() print("in the highfunc..") highfunc(sonfunc)
上面的sonfunc函數作為了入參傳遞給了highfunc函數,highfunc()是一個高階函數;
首先來看看函數作為返回的高階函數:
def sonfunc(): print("in the sonfunc..") def highfunc(func): print("in the highfunc..") return func res=highfunc(sonfunc) res()
上面的sonfunc函數作為了返回的方式,被highfunc函數給返回了,highfunc()是一個高階函數;
再來看一下常見的高階函數怎么使用的,通過這些用法加深對高階函數的理解;
map()使用方法:
map() 會根據提供的函數對指定序列做映射,用法:
map(func,iterable...) 第一個參數是提供的函數,第二個參數是指定的序列,序列可以是一個或者多個。
看一個map的例子:def square(x): return x**2
list1=[1,3,5,7] res=map(square,list1) print(list(res)) #匿名函數的寫法 print(list(map(lambda x: x ** 2, [1, 2, 3, 4, 5])))
上面的map函數傳入了第一個參數:square函數的地址,這個函數用於求平方;
第二個參數是一個迭代對象:list1;map()函數會對list1中的元素傳入函數中進行計算並返回一個新列表,注意這里需要用list對結果進行轉換,否則map返回的是一個map類型的對象。
reduce()使用方法:
該函數將一個數據集合(鏈表,元組等)中的所有數據進行下列操作:用傳給 reduce 中的函數 function(有兩個參數)先對集合中的第 1、2 個元素進行操作,得到的結果再與第三個數據用 function 函數運算,最后得到一個結果;
reduce()函數接收的的參數和map()類似,一個函數f,一個list,但行為和map()不同,reduce()傳入的參數f必須接受2個參數;
特別說明:在python3中,reduce()函數需要引入:
from functools import reduce
def add(x,y): return x+y print(reduce(add,[1,2,3,4,5]))
#
匿名函數的寫法:
print(reduce(lambda x,y:x+y,[1,2,3,4,5]))
以上計算結果是:15,計算的過程是:
第一次調用是把list中的前兩個元素傳遞給add,第二次調用時,就是把前兩個list元素的計算結果當成第一個參數,list的第三個元素當成第二個參數,傳入add進行操作,以此類推,並最終返回結果;
計算的過程是:
1,計算a=add(1,2)的值為3
2,計算b=add(a,3)的值為6
3,計算c=add(b,4)的值為10
4,計算d=add(c,5)的值為15
相當於1+2+3+4+5+10 ,如果還有其他函數
filter()函數使用方法:
filter()函數是python內置的另一個有用的高階函數,filter()函數接收一個函數f和一個list,這個函數f的作用是對每個元素進行判斷,返回true或false,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件的元素組成的list;
格式:filter(function, iterable)
看一個例子:
list1=[1,2,3,4,5,6,7,8,9,10] def even(x): return x%2!=1 print(list(filter(even,list1))) #匿名函數的寫法 print(list(filter(lambda x:x%2==0,[1,2,3,4,5,6,7,8,9,10])))
上面定義了一個偶數函數even,使用filter過濾以后再給出一個新的偶數列表;
大家有沒有掌握PYTHON對應的高階函數知識呢?