函數本質上也是一個對象,因此,既可以賦值給其他的對象名,也可作爲參數傳遞。
1. 函數作爲參數(函數名就是一個對象)
def f1(a ,b):
return a + b
def f2(func, a , b):
print func(a,b)
f2(f1,1,2)
說明:函數f2的參數func就是一個函數對象,調用f2的時候將f1函數對象作爲參數傳遞給func。
參考:既然函數名可以作爲參數傳遞,那我們是不是考慮下用一種方法來定義函數呢,python中提供了lambda函數的用法,目的就是來定義函數的。舉例如下:
f = lambda a, b: a + b
print f(1,2)
說明:利用lambda動態生成一個函數對象賦給f,函數參數爲a和b,返回值是a+b。這樣生成函數對象是不是很方便呢!以上例子與下面的等價:
def f(a, b):
return a + b
2. Python 中的map()函數(可以將函數對象依次作用到表的每一個元素)
先來看一個例子:
s = map((lambda i: i +3), [1,2,3])
print s
說明:在這裏,map函數的第一個是一個lambda定義的函數對象,另一個是表。函數的含義就是將表中的每個元素加3之後,返回給表s。概括說map函數的作用是:通過讀入的函數對象來對數據進行操作。
3. Python的filter函數(可將作爲參數的函數對象作用到元素上)
先來看一個例子:
def f(a):
if a > 10:
return True
else:
return False
s = filter(f,[5,12,23,10])
print s
說明:filter函數與map函數相似,第一個參數均爲函數對象。Filter函數中,若函數對象返回的是True,則將當前的元素返回儲存在表中。Filter函數是用來篩選數據的(元素個數可能減少),map函數是用來處理數據的(元素個數不變化)。
4. Python中的reduce函數
先來看一個例子:
s = reduce((lambda a, b: a +b), [1,2,3,4])
print s
說明:reduce函數同以上介紹的兩個函數類似,第一個參數都是函數對象。這這裏,reduce函數的第一個參數是lambda函數(用來接收a,b,返回a+b),reduce將表中的前兩個元素1和2傳遞給lambda函數,得到3,返回值3作爲lambda函數的第一個參數,表中的下一個元素3作爲lambda函數的第二個參數,進行下一次的lambda函數調用,得到6。同理,下次得到返回值10,直到表中沒有元素。上面例子等同與數學運算表達式:(( 1 + 2 ) + 3 ) + 4