Python匿名函數詳解


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)]
>>>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM