匿名函數
匿名函數就是不需要顯式的指定函數名。
關鍵字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()
函數接收兩個參數,一個是函數,一個是Iterable
,map
將傳入的函數依次作用到序列的每個元素,並把結果作為新的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)]