Lambda 函數(shù)
Lambda函數(shù)是一種匿名函數(shù),也就是說,它沒有使用def關(guān)鍵字定義的函數(shù)名。Lambda函數(shù)通常用于簡(jiǎn)短的、一次性的任務(wù),比如作為參數(shù)傳遞給高階函數(shù)(例如filter()、map()等)。
lambda arguments: expression
這里,arguments是傳遞給lambda函數(shù)的參數(shù)列表,expression是一個(gè)關(guān)于這些參數(shù)的表達(dá)式,它返回的值就是這個(gè)lambda函數(shù)的返回值。
Lambda 函數(shù)可以接受任意數(shù)量的參數(shù),但只能有一個(gè)表達(dá)式。這個(gè)表達(dá)式的計(jì)算結(jié)果就是函數(shù)的返回值。
例如,一個(gè)簡(jiǎn)單的lambda函數(shù),它接受一個(gè)參數(shù)并返回它的平方:
square = lambda x: x * x
print(square(5)) # 輸出 25
好,以上我們了解了Lambda函數(shù)的基本使用方法,接下來分享一些操作技巧,供大家學(xué)習(xí)參考。
1、與sorted()結(jié)合使用進(jìn)行自定義排序
students = [{'name': 'John', 'age': 20}, {'name': 'Jane', 'age': 22}]
def sort_key(student):
return student['age']
sorted_students = sorted(students, key=sort_key)
print(sorted_students)
在這個(gè)例子中,我們定義了一個(gè)名為sort_key的函數(shù),它接受一個(gè)學(xué)生字典作為參數(shù),并返回學(xué)生的年齡。然后我們將這個(gè)函數(shù)傳遞給sorted()函數(shù)的key參數(shù),以便按照年齡對(duì)學(xué)生列表進(jìn)行排序。
像這種簡(jiǎn)單的排序,我們可以使用lambda函數(shù):
students = [{'name': 'John', 'age': 20}, {'name': 'Jane', 'age': 22}]
sorted_students = sorted(students, key=lambda x: x['age'])
2、與filter()結(jié)合使用進(jìn)行元素篩選
numbers = range(10)
def is_even(number):
return number % 2 == 0
even_numbers = list(filter(is_even, numbers))
print(even_numbers)
在這個(gè)例子中,我們定義了一個(gè)名為 is_even 的函數(shù),它接受一個(gè)數(shù)字作為參數(shù),并返回一個(gè)布爾值,指示該數(shù)字是否為偶數(shù)。然后我們將這個(gè)函數(shù)傳遞給 filter() 函數(shù),以便篩選出范圍內(nèi)的所有偶數(shù)。
使用lambda函數(shù):
numbers = range(10)
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
3、在高階函數(shù)中作為參數(shù)傳遞
from functools import reduce
numbers = [1, 2, 3, 4, 5]
sum_of_squares = reduce(lambda x, y: x + y * y, numbers, 0)
考慮到這部分內(nèi)容,可能部分粉絲沒有涉獵過相關(guān)內(nèi)容,所以這里解釋一下:
(1)functools是Python的標(biāo)準(zhǔn)庫中的一個(gè)模塊,它提供了用于高階函數(shù)(即那些作用于或返回其他函數(shù)的函數(shù))的實(shí)用工具。reduce函數(shù)是其中之一。
(2)sum_of_squares = reduce(lambda x, y: x + y * y, numbers, 0):這行代碼使用reduce函數(shù)來計(jì)算列表numbers中每個(gè)元素的平方和。
lambda x, y: x + y * y:它接受兩個(gè)參數(shù)x和y。這個(gè)lambda函數(shù)的目的是將當(dāng)前累積的和x與下一個(gè)元素的平方y(tǒng) * y相加,然后返回新的累積和。
numbers:這是reduce函數(shù)作用的列表。
0:這是reduce函數(shù)的初始值。在第一次調(diào)用lambda函數(shù)時(shí),x將被設(shè)置為此初始值,而y將是列表中的第一個(gè)元素。
(3)reduce函數(shù)的工作方式是遍歷列表numbers中的所有元素,每次迭代都應(yīng)用lambda函數(shù)。在第一次迭代中,x是初始值0,y是列表中的第一個(gè)元素1。lambda函數(shù)計(jì)算0 + 1 * 1,結(jié)果是1。在第二次迭代中,x是上一次迭代的結(jié)果1,y是列表中的第二個(gè)元素2。lambda函數(shù)計(jì)算1 + 2 * 2,結(jié)果是5,依此類推。最終,reduce函數(shù)返回所有元素平方的和。
因此,sum_of_squares將是1^2 + 2^2 + 3^2 + 4^2 + 5^2的結(jié)果,即55。
4、在數(shù)據(jù)處理或機(jī)器學(xué)習(xí)中的應(yīng)用
df['new_column'] = df.apply(lambda row: row['col1'] + row['col2'], axis=1)
這行代碼的作用是在 DataFrame df 中創(chuàng)建一個(gè)新的列 new_column,這個(gè)新列的每個(gè)元素是同一行的 col1 和 col2 列的和。這個(gè)操作是對(duì) DataFrame 中的每一行獨(dú)立進(jìn)行的,因此 new_column 中的每個(gè)值都是對(duì)應(yīng)行的 col1 和 col2 的和。
就我們舉的例子而言,其實(shí)這里完全可以更簡(jiǎn)單化:
df['new_column'] = df['col1'] + df['col2']
沒錯(cuò),就這個(gè)例子而言,使用下面的代碼運(yùn)行速度會(huì)更快。
在大多數(shù)情況下,應(yīng)該優(yōu)先使用向量化的操作,因?yàn)樗鼈兏。只有?dāng)需要執(zhí)行復(fù)雜的操作,且這些操作不能簡(jiǎn)單地用向量化的方式完成時(shí),才應(yīng)該考慮使用apply()方法。
盡管lambda函數(shù)在這些高級(jí)用法中很有用,但需要注意的是,對(duì)于復(fù)雜的邏輯,使用普通的函數(shù)定義可能更為清晰和可維護(hù)。Lambda函數(shù)最適合用于簡(jiǎn)短且目的明確的代碼片段。