python之lambda匿名函數的使用詳解


一,lambda函數的概念

匿名函數就是不需要顯式的指定函數名。

關鍵字lambda表示匿名函數,冒號前面的n表示函數參數,可以有多個參數。

匿名函數有個限制,就是只能有一個表達式,不用寫return,返回值就是該表達式的結果。

用匿名函數有個好處,因為函數沒有名字,不必擔心函數名沖突。此外,匿名函數也是一個函數對象,也可以把匿名函數賦值給一個變量,再利用變量來調用該函數: 
有些函數在代碼中只用一次,而且函數體比較簡單,使用匿名函數可以減少代碼量,看起來比較"優雅“。

lambda函數被稱為匿名函數,實際就是說沒有名稱的函數,形式如下:

lambda [arg1 [,arg2,.....argn]]:expression

args指的是參數,expression指條件表達式,根據參數,進行條件表達后輸出相應內容。

匿名函數返回的結果是expression條件表達式的結果。

二,lambda簡單使用

# 普通用法
def detail(x,y):
    return x*y
# lambda用法    
s = lambda x,y:x*y
print(s(3,3))

以上對比我們可以看出如果我們想計算兩個數的乘積,需要定義一個函數,傳入兩個形參,然而lambda也是直接傳入兩個形參。后面使用冒號,寫入表達式,即可得到我們所需要的結果。

lambda還可以寫成以下幾種方式:

lambda X:None          # 函數沒有輸入參數,輸出是None
lambda *args: sum(args)    # 輸入是任意個數參數,輸出是它們的和(隱性要求輸入參數必須能進行算術運算)
lambda **kwargs: 1      # 輸入是任意鍵值對參數,輸出是1

以下實例可以幫我們更好的理解這一用法:

import time
time.sleep = lambda X:None # 將等待時間設置內容為空
time.sleep(5) # 並不會等待5秒

answer = lambda *args: sum(args)  # 求和
answer(1,2,3)   # 得到結果為1+2+3=6

exzample = lambda **kwargs: 1   #設置返回為1
exzample(a=2,b=4)    # 得到結果為1

三,lambda結合python內置函數高階用法

lambda常用高階函數:

  • map()函數

  • reduce() 函數

  • sorted() 函數

  • filter() 函數

 

map()函數:

map()函數接收兩個參數,一個是函數,一個是Iterablemap將傳入的函數依次作用到序列的每個元素,並把結果作為新的Iterator返回。

遍歷序列,對序列中每個元素進行函數操作,最終獲取新的序列。

map() 會根據提供的括號內函數對給出的序列做一一映射。map(function,iterable,......),這個是map函數的形式,function為所指定的函數,iterable為所提供的序列,可為多個序列。

sp = lambda x:x**2    # 定義一個lambda函數
sq = map(sp,[2,3,4,5])   # 結合map()函數使用,依次對列表中的數據求平方
print([i for i in sq])   # 循環打印出sq中的數據

1.求列表[1,2,3,4,5,6,7,8,9],返回一個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]

# 高級解決方案
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]

 

reduce() 函數:

reduce把一個函數作用在一個序列[x1, x2, x3, ...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算,其效果就是:

reduce(func,[1,2,3]) 等同於 func(func(1,2),3)

對於序列內所有元素進行累計操作

from functools import reduce   # 引入reduce函數
sp = lambda x,y:x*y     # 定義兩個數相乘
sq = reduce(sp,[2,3,4])  # 結果計算實際為,2*3*4,輸出結果為24

reduce實際運行原理,就是前面的數據對后面的數據累加進行function函數的運算。

from functools import reduce
# 實例1
sp = lambda x,y:x+y
sq = reduce(sp,[2,3,4])   # 輸出結果為9
# 實例2
st = lambda x,y:x*10+y
sa = reduce(st,[1,2,3,4]) # 計算過程為1*10+2-->12*10+3-->123*10+4,輸出結果為1234

 

sorted() 函數:

sorted(iterable, /, *, key=None, reverse=False)

接收一個key函數來實現對可迭代對象進行自定義的排序

可迭代對象:主要與列表,字符串,元祖,集合和字典

key:接受一個函數,根據此函數返回的結果,進行排序

reverse:排序方向,默認為從小到大,reverse=True為逆向

sorted() 函數對所有可迭代的對象進行排序操作,語法類型為sorted(iterable[,.....],key[, reverse]]]),iterable為提供的序列,key[,reverse]指根據什么進行排序,排序的規則;reverse = True 降序 , reverse = False 升序(默認)

list1 = [3,4,1,6,8,4]
list2 = sorted(list1)  # 對list1按照0-9排序,結果為[1, 3, 4, 4, 6, 8]

以上是對單字符類型的數據進行排序,下面看下多類型的:

L=[('b',4),('a',3),('c',2),('d',1)] 
# x[1]實際是根據里面每個元組的下標進行排序
M = sorted(L,key=lambda x:x[1])
# 我們可以看到里面每個元組下標為1時,都為數字,4,3,2,1,所以得出結果為
# [('d', 1), ('c', 2), ('a', 3), ('b', 4)]
W = sorted(L,key=lambda x:x[0]) 
# 以上W的結果輸出為[('a', 3), ('b', 4), ('c', 2), ('d', 1)],根據字母a-z排序

我們還可以按照兩種及多種的排序的規則進行排序:

students = [('jahn', 'A', 15), ('jahn', 'B', 12), ('dave', 'B', 10)]
s = sorted(students,key=lambda x:[x[0],x[1]])
# 輸出結果為[('dave', 'B', 10), ('jahn', 'A', 15), ('jahn', 'B', 12)]

以上我們可以看到,是按照X[0],X[1],意思是指,先根據下標0排序,當遇到重復情況下,再依次進行下標為1的排序。

L=[('b',4),('a',3),('c',2),('d',1)]
M = sorted(L,key=lambda x:x[0],reverse=True)  # reverse=True倒序排列
# 輸出結果為[('d', 1), ('c', 2), ('b', 4), ('a', 3)]
# 把下面單詞以首字母排序
li = ['bad', 'about', 'Zoo', 'Credit']
print(sorted(li, key = lambda x : x[0]))
# 輸出['Credit', 'Zoo', 'about', 'bad']
"""
對字符串排序,是按照ASCII的大小比較的,由於'Z' < 'a',結果,大寫字母Z會排在小寫字母a的前面。
"""

# 假設我們用一組tuple表示學生名字和成績:

L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
# 請用sorted()對上述列表分別按名字排序
print(sorted(L, key = lambda x : x[0]))
# 輸出[('Adam', 92), ('Bart', 66), ('Bob', 75), ('Lisa', 88)]

# 再按成績從高到低排序
print(sorted(L, key = lambda x : x[1], reverse=True))
# 輸出[('Adam', 92), ('Lisa', 88), ('Bob', 75), ('Bart', 66)]

 

filter() 函數:

filter()也接收一個函數和一個序列。和map()不同的是,filter()把傳入的函數依次作用於每個元素,然后根據返回值是True還是False決定保留還是丟棄該元素。

對於序列中的元素進行篩選,最終獲取符合條件的序列

filter() 函數是用來過濾掉不符合的序列,保留符合函數規則的序列輸出,語法類型為filter(function, iterable)

# 實例1
sp = lambda x: x>5   # 定義函數需要大於5
sq = filter(sp,[2,3,4,6,7])  # sq為迭代器,需要循環遍歷出結果
print([i for i in sq])  # 輸出結果為[6,7]
# 實例2
sp1 = lambda x: x%3==0   # 判斷能否被3整除的數
sq1 = filter(sp1,[2,3,4,6,7])
print([i for i in sq1])  # 輸出結果為[3,6]
# 在一個list中,刪掉偶數,只保留奇數
li = [1, 2, 4, 5, 6, 9, 10, 15]
print(list(filter(lambda x:x % 2==1,li)))  # [1, 5, 9, 15]

# 回數是指從左向右讀和從右向左讀都是一樣的數,例如12321,909。請利用filter()篩選出回數
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]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM