python 使用 lambda 來創建匿名函數。
lambda這個名稱來自於LISP,而LISP則是從lambda calculus(一種符號邏輯形式)取這個名稱的。
在Python中,lambda作為一個關鍵字,作為引入表達式的語法。想比較def函數,lambda是單一的表達式,而不是語句塊!
所謂匿名,意即不再使用 def 語句這樣標准的形式定義一個函數。
- lambda 只是一個表達式,函數體比 def 簡單很多。
- lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
- lambda 函數擁有自己的命名空間,且不能訪問自己參數列表之外或全局命名空間里的參數。
- 雖然lambda函數看起來只能寫一行,卻不等同於C或C++的內聯函數,后者的目的是調用小函數時不占用棧內存從而增加運行效率。
語法
lambda 函數的語法只包含一個語句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
# lambda 參數列表:return [表達式] 變量
# 由於lambda返回的是函數對象(構建的是一個函數對象),所以需要定義一個變量去接收
實例一
# 可寫函數說明
sum = lambda arg1, arg2: arg1 + arg2;
# 調用sum函數
print ("相加后的值為 : ", sum( 10, 20 )) # 相加后的值為 : 30
print ("相加后的值為 : ", sum( 20, 20 )) # 相加后的值為 : 40
實例二
對字典排序
infors = [{"name":"wang","age":10},{"name":"xiaoming","age":20},{"name":"banzhang","age":10}]
infors.sort(key=lambda x:x['age']) #根據age對字典排序
print(infors)
# 排序結果 [{'name': 'wang', 'age': 10}, {'name': 'banzhang', 'age': 10}, {'name': 'xiaoming', 'age': 20}]
實例三
把lambda當一個變量
def test(a,b,func):
result = func(a,b)
return result
num = test(11,22,lambda x,y:x+y)
print(num)
匿名函數優點
- 使用Python寫一些腳本時,使用lambda可以省去定義函數的過程,讓代碼更加精簡。
- 對於一些抽象的,不會被別的地方再重復使用的函數,有時候函數起個名字也是個難題,使用lambda不需要考慮命名的問題
- 使用lambda在某些時候然后代碼更容易理解
其他高階函數
map()函數
map()是 Python 內置的高階函數,它接收一個函數 f 和一個list,並通過把函數 f 依次作用在 list 的每個元素上,得到一個新的 list 並返回。
def f(x):
return x * x
print map(f,[1,2,3,4,5,6,7]) #list里的每個元素都會走一遍f(x)方法
結果將會是:
[1, 4, 9, 10, 25, 36, 49]
reduce()函數
reduce()函數也是Python內置的一個高階函數。reduce()函數接收的參數和 map()類似,一個函數 f,一個list,但行為和 map()不同,reduce()傳入的函數 f 必須接收兩個參數,reduce()對list的每個元素反復調用函數f,並返回最終結果值。
def f(x ,y ):
return x * y
print reduce(f,[1,2,3,4]) #1*2*3*4=24
# 給初始值
def f(a,b):
return a+ b
print reduce(f,[1,2,3,4],10) #1+2+3+4+10.這里的第三個參數是做為初始值的。
filter()函數
filter()函數是 Python 內置的另一個有用的高階函數,filter()函數接收一個函數 f 和一個list,這個函數 f 的作用是對每個元素進行判斷,返回 True或 False,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。
def is_odd(x):
return x%2==1
print filter(is_odd,[1,2,3,4,5,6,7]) # [1, 3, 5, 7]
sorted()函數
sorted() 函數對所有可迭代的對象進行排序操作。
sort 與 sorted 區別:
sort 是應用在 list 上的方法,sorted 可以對所有可迭代的對象進行排序操作。
list 的 sort 方法返回的是對已經存在的列表進行操作,而內建函數 sorted 方法返回的是一個新的 list,而不是在原來的基礎上進行的操作。
語法
sorted 語法:
sorted(iterable[, cmp[, key[, reverse]]])
參數說明:
- iterable -可迭代對象。
- cmp -比較的函數,這個具有兩個參數,參數的值都是從可迭代對象中取出,此函數必須遵守的規則為,大於則返回1,小於則返回-1,等於則返回0。
- key -主要是用來進行比較的元素,只有一個參數,具體的函數的參數就是取自於可迭代對象中,指定可迭代對象中的一個元素來進行排序。
- reverse -排序規則,reverse = True 降序 , reverse = False 升序(默認)。
返回值
返回重新排序的列表。
>>>a = [5,7,6,3,4,1,2]
>>> b = sorted(a) # 保留原列表
>>> a
[5, 7, 6, 3, 4, 1, 2]
>>> b
[1, 2, 3, 4, 5, 6, 7]
>>> L=[('b',2),('a',1),('c',3),('d',4)]
>>> sorted(L, cmp=lambda x,y:cmp(x[1],y[1])) # 利用cmp函數
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
>>> sorted(L, key=lambda x:x[1]) # 利用key
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
>>> students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>> sorted(students, key=lambda s: s[2]) # 按年齡排序
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
>>> sorted(students, key=lambda s: s[2], reverse=True) # 按降序
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
>>>