Python函數學習——匿名函數


匿名函數

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

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

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

用匿名函數有個好處,因為函數沒有名字,不必擔心函數名沖突。此外,匿名函數也是一個函數對象,也可以把匿名函數賦值給一個變量,再利用變量來調用該函數:

有些函數在代碼中只用一次,而且函數體比較簡單,使用匿名函數可以減少代碼量,看起來比較"優雅“

#這段代碼
def calc(x,y):
    return x**y

#換成匿名函數
calc = lambda x,y:x**y
print(calc(2,5))

def calc(x,y):
    if x > y:
        return x*y
    else:
        return x / y
    
#三元運算換成匿名函數
calc = lambda x,y:x * y if x > y else x / y
print(calc(2,5))

匿名函數使用場景:

主要與其他函數聯合使用

map函數

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

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

 

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)

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

 

 

#接受一個list並利用reduce()求積
from functools import reduce
li = [1,2,3,4,5,6,7,8,9]
print(reduce(lambda x,y:x * y,li))
# 結果=1*2*3*4*5*6*7*8*9 = 362880

 

filter函數

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

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

# 在一個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]

 

sorted函數

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

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

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

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

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

# 對列表按照絕對值進行排序
li= [-21, -12, 5, 9, 36]
print(sorted(li, key = lambda x:abs(x)))
# [5, 9, -12, -21, 36]
""" sorted()函數按照keys進行排序,並按照對應關系返回list相應的元素: keys排序結果 => [5, 9, 12, 21, 36] | | | | | 最終結果 => [5, 9, -12, -21, 36] """

 

舉例使用:

# 把下面單詞以首字母排序
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)]

 


免責聲明!

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



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