1. 程式人生 > >Python中lambda的使用,與它的三個好基友介紹!

Python中lambda的使用,與它的三個好基友介紹!

匿名函式lambda

除了def語句,python還提供了一種生成函式物件的表示式形式。由於它與LISP語言中的一個工具類似,所以稱為lambda。

就像def一樣,這個表示式建立了一個之後能夠呼叫的函式,但是它返回一個函式而不是將這個函式賦值給一個變數。這些就是lambda叫做匿名函式的原因。實際上,他常常以一種行內進行函式定義的方式使用,或者用作推遲執行一些程式碼。

lambda的一般形式是關鍵字lambda之後跟著一個或多個引數(與一個def頭部內用括號括起來的引數列表類似),緊跟著是一個冒號,之後是表示式

lambda arg1,arg2,argn:expression using arguments

由lambda表示式所返回的函式物件與由def建立並複製後的函式物件工作起來是完全一致的,但lambda有一些不同之處,讓其扮演特定的角色時更有用:

lambda是一個表示式,而不是一個語句

因為這一點,lambda可以出現在python語法不允許def出現的地方。
此外,作為一個表示式,lambda返回一個值(一個新的函式),可以選擇性的賦值給一個變數
相反,def語句總是得在頭部將一個新的函式賦值給一個變數,而不是將這個函式作為結果返回。

lambda的主題是單個表示式,而不是一個程式碼塊

這個lambda的主題簡單的就好像放在def主體return語句中的程式碼一樣。
簡單的將結果寫成一個順暢的表示式,而不是明確的返回。

但由於它僅限於表示式,故lambda通常要比def功能少…你僅能夠在lambda主體中封裝有限的邏輯進去,因為他是一個為編寫簡單函式而設計的。
除了上述這些差別,def和lambda都能過做同樣種類的工作

def與lambda的相同用法

x = lambda x, y, z: x + y + z
x(2, 3, 4)
>>> 9

y = (lambda a='hello', b='world': a + b)
y(b='Python')
>>> 'hellopython'

為什麼使用lambda

看過上面的兩個小例子,很多人會說這個和def沒什麼差別,我們又為什麼要使用lambda呢?

通常來說,lambda起到一種函式的速寫作用,允許在使用的程式碼內嵌一個函式的定義,他完全是可選的(是可以使用def代替他們),但是在你僅需要切入一段可執行程式碼的情況下,它會帶來一個更簡潔的書寫效果。

lambda通常用來編寫跳轉表,也就是行為的列表或者字典,能夠按照需求執行操作,比如:

l = [lambda x: x ** 2, lambda x: x ** 3, lambda x: x ** 4]
for f in l:
    print(f(2))
>>> 4
>>> 8
>>> 16
print(l[0](3))
>>> 9

當需要把小段的可執行程式碼編寫進def語句從語法上不能實現的地方是,lambda表示式作為def的一種速寫來說,是最為有用的,如果上面的程式碼用def編寫,則變為:

def f1(x):
    return x ** 2
 
def f2(x):
    return x ** 3
 
def f3(x):
    return x ** 4
 
l = [f1, f2, f3]

for f in l:
    print(f(2))
print(l[0](3))

實際上,我們可以用python中的字典或者其他的資料結構來構建更多種類的行為表,從而做同樣的事情。

lambda中實現if-else

Python中具備的單行表示式:if a:b else c語法在lambda中同樣適用:

lower = lambda x,y:x if x<y else y
lower(4,5)
>>> 4

看了半天,大家可能也並未覺得lambda在python中到底比def優越與便利在哪裡,那麼說到lambda,就必須要提及三個函式map、filter、reduce,當你接觸了這三個函式,那麼你才能感受到lambda真實的方便之處

map 函式

程式對列表或者其他序列常常要做的一件事就是對每個元素進行一個操作,並把其結果集合起來。
python提供了一個工具map,它會對一個序列物件中的每一個元素應用該的函式,並返回一個包含了所有函式呼叫結果的列表。

舉個栗子,我們有一個列表,需要將列表的每一個欄位+10,我們該如何操作?

list_show = [1, 2, 3, 4]
# 方式1
new_list_show = []
for i in list_show:
    new_list_show.append(i + 10)

print(new_list_show)

# 方式2
def adds(x):
    return x + 10

print(list(map(adds, list_show)))

# 更優雅的方式3:
print(list(map(lambda x: x + 10, list_show)))

看看上面三個實現方式,你覺得那種更加Pythonic?

eg:需要注意一點,map在python3中是一個可迭代物件,引入需要使用列表呼叫來使它生成所有的結果用於顯示,python2不必如此。

當然map的闡述函式,不僅僅支援自己編寫的,同樣也支援python自帶的多種函式,比如:

list_show = [1, -2, 3, -4, 5, -6]
print(list(map(abs, list_show)))
>>> [1, 2, 3, 4, 5, 6]

filter函式

filter通過字面意思,大家就知道它的用處了,用於資料的過濾操作,它也是lambda的一個好基友,舉個栗子。
我們需要過濾0-9中,能被2整除的數字組成一個列表,我們該如何操作?只需要一行程式碼:

print(list(filter(lambda x: x % 2 == 0, range(10))))
>>> [0, 2, 4, 6, 8]

沒錯,filter就是這麼的簡單實用….

reduce的妙用

reduce在python2中是一個簡單的函式,但在python3中它責備收錄與functools中。
它接收一個迭代器來處理並返回一個單個的結果。

list_show = [1, 2, 3, 4]
print(reduce(lambda x, y: x + y, list_show))
>>> 10
print(reduce(lambda x, y: x * y, list_show))
>>> 24

lambda的實用與它的好基友就介紹到這裡,希望對大家有所幫助