python3 第二十四章 - 函數式編程之Anonymous function(匿名函數)

匿名函數指一類無須定義標識符的函數或子程序。Python用lambda語法定義匿名函數,只需用表達式而無需申明。
lambda語法的定義以下:python

lambda [arg1 [,arg2, ... argN]] : expression

有些時候,當咱們在傳入函數時,不須要顯式地定義函數,直接傳入匿名函數更方便。匿名函數有個限制,就是隻能有一個表達式,無需寫return,返回值就是該表達式的結果。用匿名函數有個好處,由於函數沒有名字,沒必要擔憂函數名衝突。此外,匿名函數也是一個函數對象,也能夠把匿名函數賦值給一個變量,再利用變量來調用該函數express

實例:函數

# 可寫函數說明
sum = lambda arg1, arg2: arg1 + arg2 # 調用sum函數
print("相加後的值爲 : ", sum(10, 20)) print("相加後的值爲 : ", sum(20, 20))

以上代碼,輸出:spa

相加後的值爲 :  30 相加後的值爲 : 40

 

在定義時直接被調用,好比:code

print((lambda x, y: x-y)(3, 4))

 以上代碼,輸出:對象

-1

 

 但一般都是在定義lambda函數的同時將其應用做爲參數傳遞給另外一個函數,該函數在其處理過程當中對lambda定義的函數進行調用,例如:blog

L = [1, 2, 3, 4, 5, 6, 7, 8] # 過濾掉全部的偶數
res = filter(lambda x: x % 2 == 1, L) print(list(res))

 以上代碼,輸出:遞歸

[1, 3, 5, 7]

 

 

上面幾個實例都是比較簡單的,咱們再來看幾個複雜的。假如,咱們要找出兩個數中小的那一個,咱們能夠用lambda這麼寫:作用域

fn = lambda x, y: x if x < y else y print(fn(1, 2))

 以上代碼,輸出:get

1

 

在上面的實例中,函數體裏的那種寫法,其實是python中的三元表達式(三目運算符)。在Python中,語法以下:

爲真時的結果 if 斷定條件 else 爲假時的結果

 例如:

1 if 5>3 else 0

是先輸出結果,再斷定條件,輸出1,若是5大於3,不然輸出0

 

再來幾個更復雜的,後面這幾個若是你是初學者,能夠略過!

柯里化(什麼是柯里化?https://baike.baidu.com/item/%E6%9F%AF%E9%87%8C%E5%8C%96/10350525?fr=aladdin):

res = (lambda x: (lambda y: (lambda z: x + y + z)(1))(2))(3) print(res)

 以上代碼,輸出:

6

 

遞歸:

func = lambda n: 1 if n == 0 else n * func(n-1) print(func(5))

 以上代碼,輸出:

120

f = lambda func, n: 1 if n == 0 else n * func(func, n - 1) print(f(f, 4))

 以上代碼,輸出:

24

 

 匿名函數有如下幾個特色:

  • lambda 只是一個表達式,函數體比 def 簡單不少。
  • lambda的主體是一個表達式,而不是一個代碼塊。僅僅能在lambda表達式中封裝有限的邏輯進去。
  • lambda 函數擁有本身的命名空間,像嵌套的函數定義,lambda 函數能夠從包含它的做用域中引用變量。
相關文章
相關標籤/搜索