在Python中有三個(gè)基礎(chǔ)函數(shù),分別是filter()、map()和reduce(),他們分別為我們提供過濾、映射和聚合的功能。上一節(jié)我們簡單的使用了filter()函數(shù)結(jié)合匿名函數(shù),下面我們會(huì)詳細(xì)介紹它的用法。
1. filter()函數(shù)
在數(shù)據(jù)篩選和過濾的時(shí)候我們通常會(huì)采用filter()函數(shù)幫助我們快速的解決問題,它的語法格式為:
filter(函數(shù),可迭代對象)
在filter函數(shù)中,前面放我們的過濾或篩選方式,即函數(shù)名,后面存放可迭代的對象,我們看下面的例子:
def test(x): if x % 2 == 0: return x my_list = [1,2,3,4,5,6] print(filter(test,my_list))#只需要些函數(shù)名即可,不用加參數(shù)
輸出結(jié)果:
<filter object at 0x034C2DD8>
關(guān)于這個(gè)例子,我們首先定義了一個(gè)test()函數(shù),如果x是偶數(shù)則返回其值,然后通過filter()函數(shù)使用test()函數(shù)來過濾my_list列表,但是輸出結(jié)果卻是<filter object at 0x034C2DD8>,在這里我們需要注意filter()函數(shù)的返回值為一個(gè)可迭代的對象,我們需要通過迭代的方式訪問其中的值,或者使用列表list()函數(shù)強(qiáng)制類型轉(zhuǎn)換。
def test(x): if x % 2 == 0: return x my_list = [1,2,3,4,5,6] print(filter(test,my_list)) for i in filter(test,my_list): print('迭代后中的數(shù)據(jù):',i) print('使用list()方法:',list(filter(test,my_list)))
輸出結(jié)果為:
迭代后中的數(shù)據(jù): 2 迭代后中的數(shù)據(jù): 4 迭代后中的數(shù)據(jù): 6 使用list()方法: [2, 4, 6]
2. map()函數(shù)
在前面我們曾多次使用到過map()函數(shù),例如我們在輸入多個(gè)值的時(shí)候,我們會(huì)采用map()函數(shù),我們需要輸入四個(gè)值的時(shí)候:
a,b,c,d = map(int,input().split()) print(a,b,c,d)
map()函數(shù)的語法格式為:
map(函數(shù),可迭代對象)
在使用map()函數(shù)的時(shí)候,我們大多用于對數(shù)據(jù)的處理,把可迭代對象中的數(shù)據(jù)經(jīng)過函數(shù)處理之后存儲(chǔ),我們在存儲(chǔ)的時(shí)候繼續(xù)采用list()函數(shù)進(jìn)行存儲(chǔ)。
我們先看上面輸入四個(gè)值的例子,int為函數(shù),input().splite輸入的值為可迭代的對象,經(jīng)過int函數(shù)的處理后存放在map對象當(dāng)中。
我們可以通過map()函數(shù)將一個(gè)序列中的所有數(shù)據(jù)通過一個(gè)函數(shù)進(jìn)行處理,看下面的例子:
我們在一個(gè)列表中存放了一下字母,如果存在小寫字母,那么將它變成大寫字母。
代碼如下:
def test(x): if x.islower(): return x.upper() else: return x my_list = ['d','o','t','C','p','P'] print(list(map(test,my_list)))
輸出結(jié)果為:
['D', 'O', 'T', 'C', 'P', 'P']
test()函數(shù)中會(huì)先對x進(jìn)行判斷,如果是小寫字母就返回它的大寫字母,如果不是小寫字母就返回它的值。
3. reduce()函數(shù)
reduce()函數(shù)用于把可迭代的對象通過函數(shù)方法進(jìn)行聚合。
語法格式為:
reduce(函數(shù), 可迭代對象[, 初始值])
舉個(gè)例子,我們已知一個(gè)列表為[1,2,3,4],我們需要求列表里所有項(xiàng)依次相乘的和,我們可以使用reduce()函數(shù)。
from functools import reduce#reduce函數(shù)在functools模塊中定義,需要引入 def test(x,y): return x * y my_list = [1,2,3,4] print(reduce(test,my_list))
輸出結(jié)果為:
第一行代碼為引入這種方法,后面會(huì)對模塊進(jìn)行講解,test()函數(shù)返回了兩個(gè)數(shù)據(jù)相乘,然后通過reduce()函數(shù)將my_list列表處理。
處理過程如下圖:
先執(zhí)行第一步,然后得到一個(gè)結(jié)果再和后一項(xiàng)相乘,依次到最后一位。
4. 總結(jié)
這三種函數(shù)我們常用的為前兩者,熟練掌握這三個(gè)函數(shù)能夠幫助我們解決一系列復(fù)雜的問題,下一節(jié)我們來學(xué)習(xí)遞歸函數(shù)。
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍(lán)橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習(xí)題和答疑,點(diǎn)擊了解:
一點(diǎn)編程也不會(huì)寫的:零基礎(chǔ)C語言學(xué)練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進(jìn)階課程
從零到寫出一個(gè)爬蟲的Python編程課程
只會(huì)語法寫不出代碼?手把手帶你寫100個(gè)編程真題的編程百練課程
信息學(xué)奧賽或C++選手的 必學(xué)C++課程
藍(lán)橋杯ACM、信息學(xué)奧賽的必學(xué)課程:算法競賽課入門課程
手把手講解近五年真題的藍(lán)橋杯輔導(dǎo)課程