python匿名函數(shù)之lambda函數(shù)詳解
一、概念介紹
匿名函數(shù):是指一類無需定義標(biāo)識(shí)符(函數(shù)名)的函數(shù)或子程序

關(guān)鍵字lambda表示匿名函數(shù),冒號(hào)前面的n表示函數(shù)參數(shù),可以有多個(gè)參數(shù)。
匿名函數(shù)有個(gè)限制,就是只能有一個(gè)表達(dá)式,不用寫return,返回值就是該表達(dá)式的結(jié)果。
用匿名函數(shù)有個(gè)好處,因?yàn)楹瘮?shù)沒有名字,不必?fù)?dān)心函數(shù)名沖突。此外,匿名函數(shù)也是一個(gè)函數(shù)對(duì)象,也可以把匿名函數(shù)賦值給一個(gè)變量,再利用變量來調(diào)用該函數(shù):
有些函數(shù)在代碼中只用一次,而且函數(shù)體比較簡(jiǎn)單,使用匿名函數(shù)可以減少代碼量,看起來比較"優(yōu)雅“
相比函數(shù),lamba 表達(dá)式具有以下 2 個(gè)優(yōu)勢(shì):
- 對(duì)于單行函數(shù),使用 lambda 表達(dá)式可以省去定義函數(shù)的過程,讓代碼更加簡(jiǎn)潔;
- 對(duì)于不需要多次復(fù)用的函數(shù),使用 lambda 表達(dá)式可以在用完之后立即釋放,提高程序執(zhí)行的性能。
def calc(x,y):
return x**y
#換成匿名函數(shù)
calc = lambda x,y:x**y
print(calc(2,5))
def calc(x,y):
if x > y:
return x*y
else:
return x / y
#三元運(yùn)算換成匿名函數(shù)
calc = lambda x,y:x * y if x > y else x / y
print(calc(2,5))二、使用場(chǎng)景
2.1、和map函數(shù)一起使用
map()函數(shù)接收兩個(gè)參數(shù),一個(gè)是函數(shù),一個(gè)是Iterable,map將傳入的函數(shù)依次作用到序列的每個(gè)元素,并把結(jié)果作為新的Iterator返回
遍歷序列,對(duì)序列中每個(gè)元素進(jìn)行函數(shù)操作,最終獲取新的序列。

## 求列表[1,2,3,4,5,6,7,8,9],返回一個(gè)n*n 的列表
#一般解決方案
li = [1,2,3,4,5,6,7,8,9]
for ind,val in enumerate(li):
li[ind] = val * val
print(li)
# [1, 4, 9, 16, 25, 36, 49, 64, 81]
# 高級(jí)解決方案
li = [1,2,3,4,5,6,7,8,9]
print(list(map(lambda x:x*x,li)))
# [1, 4, 9, 16, 25, 36, 49, 64, 81]
2.2、與reduce函數(shù)一起使用
reduce把一個(gè)函數(shù)作用在一個(gè)序列[x1, x2, x3, ...]上,這個(gè)函數(shù)必須接收兩個(gè)參數(shù),reduce把結(jié)果繼續(xù)和序列的下一個(gè)元素做累積計(jì)算,其效果就是:
reduce(func,[1,2,3]) 等同于 func(func(1,2),3),返回值為單個(gè)值
對(duì)于序列內(nèi)所有元素進(jìn)行累計(jì)操作

#接受一個(gè)list并利用reduce()求積 from functools import reduce li = [1,2,3,4,5,6,7,8,9] print(reduce(lambda x,y:x * y,li)) # 結(jié)果=1*2*3*4*5*6*7*8*9 = 362880 a = [12, 34, 56] print reduce(lambda x , y: x + y, a) # 102 print reduce(lambda x , y: x - y, a) # -78
2.3、和filter函數(shù)一起使用
filter()也接收一個(gè)函數(shù)和一個(gè)序列。和map()不同的是,filter()把傳入的函數(shù)依次作用于每個(gè)元素,然后根據(jù)返回值是True還是False決定保留還是丟棄該元素。
對(duì)于序列中的元素進(jìn)行篩選,最終獲取符合條件的序列

# 在一個(gè)list中,刪掉偶數(shù),只保留奇數(shù) li = [1, 2, 4, 5, 6, 9, 10, 15] print(list(filter(lambda x:x % 2==1,li))) # [1, 5, 9, 15] # 回?cái)?shù)是指從左向右讀和從右向左讀都是一樣的數(shù),例如12321,909。請(qǐng)利用filter()篩選出回?cái)?shù) li = list(range(1, 200)) print(list(filter(lambda x:int(str(x))==int(str(x)[::-1]),li))) [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99, 101, 111, 121, 131, 141, 151, 161, 171, 181, 191]
2.4、和sorted函數(shù)一起使用
sorted(iterable, /, *, key=None, reverse=False)
接收一個(gè)key函數(shù)來實(shí)現(xiàn)對(duì)可迭代對(duì)象進(jìn)行自定義的排序
- 可迭代對(duì)象:主要與列表,字符串,元祖,集合和字典
- key:接受一個(gè)函數(shù),根據(jù)此函數(shù)返回的結(jié)果,進(jìn)行排序
- reverse:排序方向,默認(rèn)為從小到大,reverse=True為逆向
# 對(duì)列表按照絕對(duì)值進(jìn)行排序
li= [-21, -12, 5, 9, 36]
print(sorted(li, key = lambda x:abs(x)))
# [5, 9, -12, -21, 36]
"""
sorted()函數(shù)按照keys進(jìn)行排序,并按照對(duì)應(yīng)關(guān)系返回list相應(yīng)的元素:
keys排序結(jié)果 => [5, 9, 12, 21, 36]
| | | | |
最終結(jié)果 => [5, 9, -12, -21, 36]
"""
# 把下面單詞以首字母排序
li = ['bad', 'about', 'Zoo', 'Credit']
print(sorted(li, key = lambda x : x[0]))
# 輸出['Credit', 'Zoo', 'about', 'bad']
"""
對(duì)字符串排序,是按照ASCII的大小比較的,由于'Z' < 'a',結(jié)果,大寫字母Z會(huì)排在小寫字母a的前面。
"""
# 假設(shè)我們用一組tuple表示學(xué)生名字和成績(jī):
L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
# 請(qǐng)用sorted()對(duì)上述列表分別按名字排序
print(sorted(L, key = lambda x : x[0]))
# 輸出[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]
# 再按成績(jī)從高到低排序
print(sorted(L, key = lambda x : x[1], reverse=True))
# 輸出[('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]2.5、與三元運(yùn)算結(jié)合
如下:
#if 條件為真的時(shí)候返回if前面內(nèi)容,否則返回0 exp1= lambda x:x+1 if 2==1 else 0 print(exp1(2)) exp2 = lambda x:x+1 if 1==1 else 0 print(exp2(2)) 輸出: 0 3 #if not 為假返回if not前面內(nèi)容,否則返回0 exp3 = lambda x:x+1 if not 2==1 else 0 print(exp3(2)) exp4 = lambda x:x+1 if not 1==1 else 0 print(exp4(2)) 輸出: 3 0
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
keras在構(gòu)建LSTM模型時(shí)對(duì)變長(zhǎng)序列的處理操作
這篇文章主要介紹了keras在構(gòu)建LSTM模型時(shí)對(duì)變長(zhǎng)序列的處理操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Pandas庫中isnull函數(shù)的實(shí)現(xiàn)
isnull()是Pandas庫中DataFrame和Series對(duì)象的一個(gè)函數(shù),用于檢測(cè)數(shù)據(jù)中的缺失值,本文主要介紹了Pandas庫中isnull函數(shù)的實(shí)現(xiàn),具有一定參考價(jià)值,感興趣的可以了解一下2024-07-07
Keras 切換后端方式(Theano和TensorFlow)
這篇文章主要介紹了Keras 切換后端方式(Theano和TensorFlow),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Python實(shí)現(xiàn)實(shí)時(shí)監(jiān)測(cè)可視化數(shù)據(jù)大屏
實(shí)時(shí)監(jiān)測(cè)的可視化數(shù)據(jù)大屏是一種非常有用的工具,可以幫助我們實(shí)時(shí)了解數(shù)據(jù)的變化和趨勢(shì),下面我們將介紹如何使用Python代碼實(shí)現(xiàn)實(shí)時(shí)監(jiān)測(cè)的可視化數(shù)據(jù)大屏,需要的可以參考一下2023-06-06
Python 推導(dǎo)表達(dá)式的幾種方法實(shí)現(xiàn)
推導(dǎo)表達(dá)式是Python中一種遍歷序列并創(chuàng)建指定類型對(duì)象的方法,常用的推導(dǎo)表達(dá)式有:列表表達(dá)式、生成器表達(dá)式、字典表達(dá)式、集合表達(dá)式等,下面就來介紹一下2025-06-06
Python調(diào)用VBA實(shí)現(xiàn)保留原始樣式的表格合并方法
本文主要介紹了Python調(diào)用VBA實(shí)現(xiàn)保留原始樣式的表格合并方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
python隨機(jī)生成大小寫字母數(shù)字混合密碼(僅20行代碼)
這篇文章主要介紹了python隨機(jī)生成大小寫字母數(shù)字混合密碼,主要是利用random模塊隨機(jī)生成數(shù)字,大小寫字母,通過循環(huán)次數(shù)來實(shí)現(xiàn)此功能,需要的朋友可以參考下2020-02-02
使用python根據(jù)端口號(hào)關(guān)閉進(jìn)程的方法
今天小編就為大家分享一篇使用python根據(jù)端口號(hào)關(guān)閉進(jìn)程的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-11-11
Pyinstaller打包多個(gè)資源文件的超詳細(xì)教程(推薦!)
Pyinstaller是著名python打包module,軟件或者小工具用python寫好后,用pyinstaller 可以實(shí)現(xiàn)輕松打包,下面這篇文章主要給大家介紹了關(guān)于Pyinstaller打包多個(gè)資源文件的超詳細(xì)教程,需要的朋友可以參考下2022-12-12

