Python中l(wèi)ambda表達式的使用詳解(完整通透版)
一、前言
lambda
表達式是Python中的一種簡潔的匿名函數(shù)表達方式,它用于創(chuàng)建簡單的函數(shù),通常在不需要定義完整函數(shù)的情況下使用。lambda
表達式的語法非常簡潔,適合編寫一行的小函數(shù)。
接下來我們從具體的例子出發(fā),由淺入深理解如何使用lambda表達式。
二、 基本語法
lambda 參數(shù)1, 參數(shù)2, ... : 表達式
lambda
引導(dǎo)關(guān)鍵字,表示這是一個匿名函數(shù)。- 后面緊跟參數(shù),參數(shù)之間用逗號分隔。
- 冒號后是函數(shù)的表達式,也就是返回值。
相當(dāng)于簡寫形式的 def
函數(shù)定義。
三、舉個簡單的例子:
# 普通函數(shù) def add(x, y): return x + y # 用 lambda 表達式寫成 add_lambda = lambda x, y: x + y # 調(diào)用 print(add(2, 3)) # 輸出: 5 print(add_lambda(2, 3)) # 輸出: 5
在這個例子中,add_lambda
是一個等價于 add
的匿名函數(shù),但它使用了 lambda
表達式來定義。
四、常見應(yīng)用場景
1. 用于排序函數(shù)
當(dāng)我們需要排序一個包含元組、字典等復(fù)雜數(shù)據(jù)類型的列表時,通常會使用 lambda
來定義排序的規(guī)則。
例如在列表的.sort排序函數(shù)的參數(shù)中,使用key=一個lambda表達式指定排序規(guī)則。
# 按照元組中的第二個元素排序 points = [(1, 2), (3, 1), (5, 4)] points.sort(key=lambda x: x[1]) print(points) # 輸出: [(3, 1), (1, 2), (5, 4)]
在排序函數(shù)的示例中,我們使用了 lambda
表達式和列表的 sort
方法,對一個包含元組的列表進行排序。下面我將逐步講解這個例子的工作原理。
sort() 方法簡介
sort()
是 Python 中列表的一個內(nèi)置方法,用于就地對列表進行排序(即會直接修改原始列表)。它可以根據(jù)默認順序(即數(shù)字從小到大,字符串按字典順序)對列表元素排序。
我們可以使用 key
參數(shù)來自定義排序規(guī)則。key
接受一個函數(shù),這個函數(shù)用于生成用于比較的值。
例如,默認情況下,sort()
方法是基于元素的值排序:
numbers = [3, 1, 2] numbers.sort() print(numbers) # 輸出: [1, 2, 3]
但是,如果我們想要按自定義規(guī)則排序,例如根據(jù)元組的某個元素(例如第二個元素)進行排序,我們就可以使用 key
參數(shù)。
lambda 表達式的作用
在這個例子中,我們要對一個包含多個元組的列表 points
進行排序,而排序的依據(jù)是每個元組的第二個元素(索引為1的元素)。要實現(xiàn)這個功能,我們使用 lambda
表達式:
key=lambda x: x[1]
這里 x
是列表中的每個元組,x[1]
表示元組的第二個元素。我們告訴 sort
方法,應(yīng)該根據(jù)每個元組的第二個元素來排序。
詳細解釋
數(shù)據(jù)結(jié)構(gòu):
points = [(1, 2), (3, 1), (5, 4)]
這是一個包含三個元組的列表,每個元組包含兩個數(shù)字。例如,(1, 2)
表示一個點的坐標,1
是x
坐標,2
是y
坐標。lambda
表達式:key=lambda x: x[1]
x
代表列表中的每個元組。x[1]
提取元組的第二個元素。lambda
表達式的作用是告訴sort
方法,只需要考慮每個元組的第二個元素進行比較排序。
排序過程:
sort()
方法從列表的第一個元組開始,對每個元組調(diào)用lambda x: x[1]
,返回第二個元素的值,作為排序的依據(jù)。對元組
(1, 2)
,lambda
返回2
。對元組(3, 1)
,返回1
。對元組(5, 4)
,返回4
。然后,
sort()
方法按照1
,2
,4
的順序?qū)υM排序,結(jié)果是:[(3, 1), (1, 2), (5, 4)]
。
最終結(jié)果:
排序后的列表points
為[(3, 1), (1, 2), (5, 4)]
。這個結(jié)果是根據(jù)每個元組的第二個元素從小到大排序的。
進一步擴展
如果我們想按元組的第一個元素排序,只需要將 x[1]
改為 x[0]
:
points.sort(key=lambda x: x[0]) print(points) # 輸出: [(1, 2), (3, 1), (5, 4)]
如果你想實現(xiàn)降序排序,可以設(shè)置 reverse=True
:
points.sort(key=lambda x: x[1], reverse=True) print(points) # 輸出: [(5, 4), (1, 2), (3, 1)]
總結(jié)
lambda
表達式在排序函數(shù)中用于簡潔地定義排序的依據(jù)。通過傳遞 key
參數(shù),我們可以輕松自定義排序規(guī)則,比如按元組中的某個特定元素排序。
2、與 map、filter、reduce 等函數(shù)結(jié)合
lambda
表達式與 map
、filter
、reduce
等高階函數(shù)結(jié)合使用是 Python 編程中的一個強大工具。接下來我們會詳細解釋這三種函數(shù)及其結(jié)合 lambda
的用法。
1、 map() 函數(shù)
map()
函數(shù)用于對可迭代對象中的每個元素應(yīng)用一個函數(shù),并返回一個新的迭代器。它可以接受一個函數(shù)和一個或多個可迭代對象(如列表、元組)。
語法:
map(function, iterable)
function
是要應(yīng)用于每個元素的函數(shù)。iterable
是可迭代對象(例如列表、元組等)。
當(dāng)結(jié)合 lambda
使用時,lambda
表達式作為匿名函數(shù)傳遞給 map()
。
示例:將列表中的每個數(shù)字平方
nums = [1, 2, 3, 4, 5] # 使用 lambda 表達式和 map squared = map(lambda x: x**2, nums) # 將結(jié)果轉(zhuǎn)換為列表并打印 print(list(squared)) # 輸出: [1, 4, 9, 16, 25]
解釋:
lambda x: x**2
是一個匿名函數(shù),用來計算每個數(shù)字的平方。map()
函數(shù)依次將lambda
應(yīng)用于nums
列表中的每個元素,即1
,2
,3
,4
,5
,然后返回每個元素平方后的結(jié)果。
等價的普通函數(shù)寫法:
def square(x): return x ** 2 squared = map(square, nums) print(list(squared)) # 輸出: [1, 4, 9, 16, 25]
2、 filter() 函數(shù)
filter()
函數(shù)用于篩選可迭代對象中的元素,保留那些使函數(shù)返回 True
的元素。它也返回一個迭代器。
語法:
filter(function, iterable)
function
是用于測試每個元素的函數(shù),返回True
或False
。iterable
是需要過濾的可迭代對象。
當(dāng)與 lambda
表達式結(jié)合使用時,lambda
可以作為過濾條件。
示例:篩選出列表中的偶數(shù)
nums = [1, 2, 3, 4, 5] # 使用 lambda 表達式和 filter evens = filter(lambda x: x % 2 == 0, nums) # 將結(jié)果轉(zhuǎn)換為列表并打印 print(list(evens)) # 輸出: [2, 4]
解釋:
lambda x: x % 2 == 0
是一個匿名函數(shù),用來判斷x
是否為偶數(shù)。filter()
函數(shù)依次將lambda
應(yīng)用于nums
列表中的每個元素,返回True
的元素保留,返回False
的元素被過濾掉。因此,最終結(jié)果是保留偶數(shù)2
和4
。
等價的普通函數(shù)寫法:
def is_even(x): return x % 2 == 0 evens = filter(is_even, nums) print(list(evens)) # 輸出: [2, 4]
3、 reduce() 函數(shù)
reduce()
函數(shù)用于對可迭代對象中的元素進行累積操作,最終合并為一個值。它需要導(dǎo)入 functools
模塊,因為它不屬于 Python 的內(nèi)置函數(shù)。
語法:
from functools import reduce reduce(function, iterable)
function
是一個需要兩個參數(shù)的函數(shù),用來將前一個計算結(jié)果與下一個元素進行合并。iterable
是可迭代對象。
當(dāng)與 lambda
表達式結(jié)合時,lambda
用來定義累積的規(guī)則。
示例:計算列表所有元素的累加和
from functools import reduce nums = [1, 2, 3, 4, 5] # 使用 lambda 表達式和 reduce total = reduce(lambda x, y: x + y, nums) print(total) # 輸出: 15
解釋:
lambda x, y: x + y
是一個匿名函數(shù),接受兩個參數(shù)x
和y
,并返回它們的和。reduce()
函數(shù)首先將前兩個元素1
和2
相加得到3
,然后將3
和3
相加得到6
,以此類推,直到處理完所有元素。最后返回累加結(jié)果15
。
等價的普通函數(shù)寫法:
def add(x, y): return x + y total = reduce(add, nums) print(total) # 輸出: 15
總結(jié)
map()
:對每個元素應(yīng)用函數(shù),返回每個元素的變換結(jié)果。適合批量操作。filter()
:根據(jù)條件過濾元素,保留符合條件的元素。reduce()
:對序列中的元素進行累積操作,適合需要歸約為單一值的場景。
lambda
表達式可以方便地與這些高階函數(shù)結(jié)合,減少代碼的冗余和函數(shù)的顯式定義。
3、 用于函數(shù)內(nèi)部或一次性使用的函數(shù)
當(dāng)函數(shù)只需要使用一次,可以直接用 lambda
表達式,而無需定義新的函數(shù)名。
def apply_operation(x, operation): return operation(x) # 使用 lambda 傳遞匿名函數(shù) result = apply_operation(5, lambda x: x * 2) print(result) # 輸出: 10
五、總結(jié)
lambda
表達式用于簡化代碼,尤其適用于短小的函數(shù),避免顯式定義完整函數(shù)。雖然它方便,但當(dāng)函數(shù)較為復(fù)雜時,還是建議使用普通函數(shù)定義,以提高代碼的可讀性。
到此這篇關(guān)于Python中l(wèi)ambda表達式的使用詳解的文章就介紹到這了,更多相關(guān)Python中l(wèi)ambda表達式使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python?判斷字符串當(dāng)中是否包含字符(str.contain)
這篇文章主要介紹了python?判斷字符串當(dāng)中是否包含字符(str.contain),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06Python標準庫之zipfile和tarfile模塊的使用
zipfile和tarfile是Python中常用的壓縮包模塊,本文將通過示例詳細講解一下這兩個模塊的使用方法,快跟隨小編一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06Python Tkinter模塊實現(xiàn)時鐘功能應(yīng)用示例
這篇文章主要介紹了Python Tkinter模塊實現(xiàn)時鐘功能,結(jié)合實例形式分析了Tkinter模塊結(jié)合time模塊實現(xiàn)的時鐘圖形繪制與計時功能相關(guān)操作技巧,需要的朋友可以參考下2018-07-07Python 中的參數(shù)傳遞、返回值、淺拷貝、深拷貝
這篇文章主要介紹了Python 中的參數(shù)傳遞、返回值、淺拷貝、深拷貝,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2019-06-06Python Des加密解密如何實現(xiàn)軟件注冊碼機器碼
這篇文章主要介紹了Python Des加密解密如何實現(xiàn)軟件注冊碼機器碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-01-01