初學者python筆記(map()函數、reduce()函數、filter()函數、匿名函數)


本篇文章內容有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()函數

  1. 函數嵌套——把函數當做一個參數傳給另外一個函數
def foo(n):
	print(n)
def bar(name):
	print("my name is %s"%name)  #使用了百分號類的字符串拼接
foo(bar('小瀋陽'))
#會先傳入“小瀋陽”執行bar(),並輸出,
#再將bar()的返回值,即None傳入foo()中,並輸出形參

運行結果:
my name is 小瀋陽
None

  1. 低級函數封裝
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]

  1. 高級封裝函數——最接近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]

  1. 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()函數

  1. 初級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

  1. 進階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

  1. 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函數 整合出新元素
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章