天天看點

Python筆記:lambda匿名函數

在Python中,一般使用def關鍵字來定義普通函數。顧名思義,匿名函數意味着函數沒有名稱,Python使用lambda關鍵字定義匿名函數。在某些情況下,使用匿名函數可以簡化代碼,提高代碼的可讀性。本文介紹python匿名函數的使用方法。

匿名函數

Python匿名函數的文法格式:

lambda argument1, argument2,... argumentN: expression
           

匿名函數可以有多個參數,隻有一個表達式。下面來看一下普通def函數和lambda函數的差別:

def cube(y):
    return y*y*y

lambda_cube = lambda y: y*y*y

print(cube(3))
print(lambda_cube(3))
           

執行結果:

27
27
           

可以看到,lambda函數更加簡潔,不包含“return”語句,傳回的是一個函數對象。與正常函數還有以下差別:

1、lambda 是一個表達式,不是一個語句

  • 表達式(expression)是用“公式”去表達一個東西,比如y*y*y就是一個表達式
  • 語句(statement)是完成了某些功能,比如指派語句,條件語句等
  • 由于lambda 是表達式,它可以用在一些正常函數 def 不能用的地方,比如,可以用在清單内部,可以作為某些函數的參數。

lambda 函數在清單推導式中使用:

list_num = [3, 4, 6, 2, 5, 8]
list_square = [x ** 2 for x in list_num if x % 2 == 0]
list_square2 = [(lambda x: x** 2)(x) for x in list_num if x % 2 == 0]
print(list_square)
print(list_square2)
           
[16, 36, 4, 64]
[16, 36, 4, 64]
           

作為函數的參數:根據字典值降序排序

mydict = {1:"apple",3:"banana",2:"orange"}
mydict = sorted(mydict.items(), key=lambda x: x[0], reverse=True)
print(mydict)
           
[(3, 'banana'), (2, 'orange'), (1, 'apple')]
           

2、lambda表達式隻有一行,不能寫成多行的代碼塊。

lambda 用于快速編寫簡單函數,對于更複雜的多行邏輯使用正常函數來實作。關于這點,Python 之父 Guido van Rossum 曾發了一篇文章解釋:Language Design Is Not Just Solving Puzzles

Lambda函數具有函數式程式設計的特性,關于函數式程式設計這裡不做介紹,後面有時間單獨寫一篇文章。Lambda函數可以與filter()、map()和reduce()等内置函數一起使用,下面介紹使用方法。

filter()函數

Python中的filter()函數接受一個函數對象和一個可疊代對象作為參數。

filter(function or None, iterable)
           

filter()函數對iterable中的每個元素都進行 function 判斷,并傳回 True 或者 False,最後将傳回 True 的元素組成一個新的可周遊的集合。

list_num = [3, 4, 6, 2, 5, 8]

list_even = list(filter(lambda x: x % 2 == 0, list_num))
print(list_even)

list_even2 = [i for i in list_num if i % 2 == 0]
print(list_even2)

list_even3 = []
for i in list_num:
    if i % 2 == 0:
        list_even3.append(i)
print(list_even3)

           
[4, 6, 2, 8]
[4, 6, 2, 8]
[4, 6, 2, 8]
           

如果是None,可用于過濾空格,傳回為true的可周遊集合:

list1 = ['', None, 6, 2, False, 8, True]
list1 = list(filter(None, list1))
print(list1)
           
[6, 2, 8, True]
           

map() 函數

和filter()類似,map(function, iterable) 函數表示對 iterable 中的每個元素,都運用 function 這個函數,最後傳回一個新的可周遊的集合:

list_num = [3, 4, 6, 2, 5, 8]
list_square = list(map(lambda x: x**2, list_num))
print(list_square)

list_num = [3, 4, 6, 2, 5, 8]
list_square2 = [(lambda x: x** 2)(x) for x in list_num]
print(list_square2)

list_square3 = [x**2 for x in list_num]
print(list_square3)
           
[9, 16, 36, 4, 25, 64]
[9, 16, 36, 4, 25, 64]
[9, 16, 36, 4, 25, 64]
           

reduce() 函數

reduce(function, iterable)函數同樣接收一個函數和一個清單作為參數,reduce()函數屬于functools子產品,通常用來對一個集合做一些累積操作。function 對象有兩個參數,表示對 iterable 中的每個元素以及上一次調用後的結果,運用 function 進行計算,也就是執行重複操作,最終傳回一個數值。

from functools import reduce

list_num = [3, 4, 6, 2, 5, 8]
sum = reduce(lambda x, y: x + y, list_num)
print(sum) # 輸出:28 = 3 + 4 + 6 + 2 + 5 + 8
           

總結

本文介紹了lambda函數和常見的 map(),fiilter() 和 reduce() 三個函數,匿名函數通常用于實作一個簡單功能,并且該函數隻調用一次。

map(),fiilter() 和 reduce() 三個函數通常與lambda函數結合使用,它們的功能也可以使用清單推導式 (List Comprehension)來實作。它們的性能差異不大,可以根據自己習慣使用。

--THE END--