在Python中有三個基礎函數,分別是filter()、map()和reduce(),他們分別為我們提供過濾、映射和聚合的功能。上一節我們簡單的使用了filter()函數結合匿名函數,下面我們會詳細介紹它的用法。
在資料篩選和過濾的時候我們通常會採用filter()函數來幫助我們快速的解決問題,它的語法格式為:
filter(函數,可迭代物件)
在filter函數中,前面放我們的過濾或篩選方式,也就是函數名,後面存放可迭代的對象,我們看下面的例子:
deftest(x):ifx%2==0:returnxmy_list=[1,2,3,4,5,6]print(filter(test,my_list))#只需要些函式名稱即可,不用加參數
輸出結果:
<filterobjectat0x034C2DD8>
關於這個例子,我們首先定義了一個test()函數,如果x是偶數則返回其值,然後透過filter()函數使用test()函數來過濾my_list列表,但是輸出結果卻是<filter object at 0x034C2DD8> ,在這裡我們需要注意filter()函數的回傳值為一個可迭代的對象,我們需要透過迭代的方式來存取其中的值,或是使用列表list()函數強制型別轉換。
deftest(x):ifx%2==0:returnxmy_list=[1,2,3,4,5,6]print(filter(test,my_list))foriinfilter(test,my_list):print('迭代後中的資料:',i)print('使用list()方法:',list(filter(test,my_list)))
輸出結果為:
迭代後中的資料:2迭代後中的資料:4迭代後中的資料:6使用list()方法:[2,4,6]
在前面我們曾多次使用到過map()函數,例如我們在輸入多個值的時候,我們會採用map()函數,我們需要輸入四個值的時候:
a,b,c,d=map(int,input().split())print(a,b,c,d)
map()函數的語法格式為:
map(函數,可迭代物件)
在使用map()函數的時候,我們大多用於對資料的處理,把可迭代物件中的資料經過函數處理之後存儲,我們在儲存的時候繼續採用list()函數進行儲存。
我們先看上面輸入四個值的例子,int為函數,input().splite輸入的值為可迭代的對象,經過int函數的處理後存放在map對象當中。
我們可以透過map()函數將一個序列中的所有資料透過一個函數處理,看下面的範例:
我們在一個清單中存放了一下字母,如果存在小寫字母,那麼將它變成大寫字母。
程式碼如下:
deftest(x):ifx.islower():returnx.upper()else:returnxmy_list=['d','o','t','C','p','P']print(list(map (test,my_list)))
輸出結果為:
['D','O','T','C','P','P']
test()函數中會先對x進行判斷,如果是小寫字母就回傳它的大寫字母,如果不是小寫字母就回傳它的值。
reduce()函數用來把可迭代的物件透過函數方法進行聚合。
語法格式為:
reduce(函數,可迭代物件[,初始值])
舉個例子,我們已知一個列表為[1,2,3,4],我們需要求列表裡所有項依次相乘的和,我們可以使用reduce()函數。
fromfunctoolsimportreduce#reduce函數在functools模組中定義,需要引入deftest(x,y):returnx*ymy_list=[1,2,3,4]print(reduce(test,my_list))
輸出結果為:
第一行程式碼為引入此方法,後面會對模組進行講解,test()函數傳回了兩個資料相乘,然後透過reduce()函數將my_list列表處理。
處理過程如下圖:
先執行第一步,再得到一個結果再和後一項相乘,依序到最後一位。
這三種函數我們常用的是前兩者,熟練這三個函數能夠幫助我們解決一系列複雜的問題,下一節我們來學習遞歸函數。