本篇文章內容有Python中的匿名函數和map()函數、reduce()函數、filter()函數這三大封裝函數(遍歷處理),以及它們的使用案例。 文末是對這幾個函數用法功能的比較。
一、匿名函數
該函數的用法類似於C語言中的宏定義,只是這個不需要定義名字,故叫匿名函數,但它們的作用都是用來提供一個簡短的函數。
print(lambda x:x+1) #打印匿名函數的內存地址
func1 = lambda x:x+1 #調用匿名函數第1步
func2 = lambda x,y:x*y #兩個參數的匿名函數
print(func1(10)) #調用匿名函數第2步
print(func2(4,130)) #需要傳入兩個參數以符合x,y
name = '鳴人'
func3 = lambda x:x + '——羊村村長'
print(func3(name))
運行結果:
<function at 0x02C07B70>
11
520
鳴人——羊村村長
二、map()函數
- 函數嵌套——把函數當做一個參數傳給另外一個函數
def foo(n):
print(n)
def bar(name):
print("my name is %s"%name) #使用了百分號類的字符串拼接
foo(bar('小瀋陽'))
#會先傳入“小瀋陽”執行bar(),並輸出,
#再將bar()的返回值,即None傳入foo()中,並輸出形參
運行結果:
my name is 小瀋陽
None
- 低級函數封裝
num_1 = [1,2,3,4,5]
def map_test(array):
ret = []
for i in array: #把列表中的所有元素都乘2
ret.append(i*2)
return ret #可以返回一個列表
ret = map_test(num_1) #執行封裝函數
print(ret)
運行結果:
[2, 4, 6, 8, 10]
- 高級封裝函數——最接近map()函數的本質
num_1 = [1,2,3,4,5]
def cut_one(x): #定義一個做減1運算的函數
return x-1
def add_one(x): #定義一個做加1運算的函數
return x+1
def map_test(func,array): #定義一個做全部遍歷的函數,並執行相關操作的函數
ret=[]
for i in array:
res=func(i) #add_one
ret.append(res)
return ret
print(map_test(add_one,num_1)) #加1
print(map_test(cut_one,num_1)) #減1
運行結果:
[2, 3, 4, 5, 6]
[0, 1, 2, 3, 4]
- map()函數+匿名函數——終極用法
傳入一個函數和一個列表到封裝函數中,好處是可以根據需求傳入各種定義的函數,將列表中所有的元素做處理
#第一個參數是一個函數,第二個參數是一個可迭代對象(可循環的)
num_1 = [1,2,3,4,5]
res = map(lambda x:x+1,num_1) #每個數都加1
print(list(res)) #打印的時候必須輸出列表
msg='yourself'
print(list(map(lambda x:x.upper(),msg))) #將所有字符都變大寫
#map()函數返回的是內存地址,需要list列表化或者tuple元組化纔可以打印出對應的值
運行結果:
[2, 3, 4, 5, 6]
[‘Y’, ‘O’, ‘U’, ‘R’, ‘S’, ‘E’, ‘L’, ‘F’]
原來,map()函數是做批量處理用的
三、reduce()函數
- 初級reduce()——簡單的單函數
num = [1,2,3,4,5,6,100]
def reduce_test(array):
res = 0
for n in array: #將num中的元素都累加起來
res += n
return res
print(reduce_test(num))
運行結果:121
- 進階reduce()——函數嵌套
num = [1,2,3,4,5,100]
def reduce_test(func,array,init=None): #某參數=None則爲非必須參數
if init == None:
res = array.pop(0)
#用戶沒有輸入值,則將第一個值賦值給res,並且刪除第一個值,實現每乘完一個就取出一個
else:
res = init #用戶輸入了一個值
for n in array: #將num中的元素都累乘起來
res = func(res,n) #傳入的兩個參數是需要相乘的兩個數,每次都傳入了func相乘後都更新res的值
return res
print(reduce_test(lambda x,y:x*y, num, 2))
#該匿名函數接收兩個參數對x,y兩個參數做相乘處理
運行結果:
24000
- reduce()函數——終極reduce
注意:該函數使用前需要從functools庫中導入。
即:from functools import reduce
from functools import reduce
num = [1,2,3,4,5,100]
print(reduce(lambda x,y:x*y, num, 2))
#reduce函數必須導入functools模塊,且第三個參數是非必須參數,爲初始值
運行結果:
24000
很明顯,reduce()函數做整合用的。
四、filter()函數
這個函數在我的文章:初學者python筆記(filter()函數完全詳解)裏已經專門介紹了,這裏就不做詳細分析,只拿出最後的用法。
people_onepiece=[
{'name':'路飛','age':19}, #列表中有5個字典,每個字典都有2個鍵值對
{'name':'娜美','age':20},
{'name':'山治','age':22},
{'name':'喬巴','age':12},
{'name':'烏索普','age':21}
]
print(list(filter(lambda n:n['age']<=20,people_onepiece)))
#傳入的參數是一個判斷年齡的匿名函數,一個列表
#如果年齡小於20歲,則將該字典保留下來
運行結果:
[{‘name’: ‘路飛’, ‘age’: 19}, {‘name’: ‘娜美’, ‘age’: 20}, {‘name’: ‘喬巴’, ‘age’: 12}]
可以看出,filter()函數是做篩選用的
五、三大函數總結
map()函數,filter()函數,reduce()三大批量處理函數總結:
map函數是將一個列表中所有的元素都處理了一遍(最終返回的還是一個完整列表,位置和順序都不變)
filter函數是將一個列表中所有的元素篩選了一遍,判斷每個元素得到的布爾值(最終返回的是被篩選過的元素組成的一個列表)
reduce函數是把一個完整的列表都整合出另一個數據,或累加結果,或累乘結果(最終返回的是一個元素)
map函數 | 每個元素都會變 |
---|---|
filter函數 | 保留符合條件的元素 |
reduce函數 | 整合出新元素 |