python 中 reduce / map / filter 三個函式很容易搞混淆,雖然利用函式對迭代器或者序列中的元素操作,但是適用的場景卻各不相同;
一.map函式
map函式特點:對可迭代器或者序列中的每個元素進行相同的操作(例如每個元素+1等等),并回傳迭代器或者串列,示例如下:
# !usr/bin/env python # -*- coding:utf-8 _*- """ @Author:何以解憂 @Blog(個人博客地址): shuopython.com @WeChat Official Account(微信公眾號):猿說python @Github:www.github.com @File:python_reduce_list_map.py @Time:2020/3/6 10:25 @Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累! """ def func1(x): # 將每一個元素計算平方值 print("x=%d x*x=%d"%(x,x*x)) return x*x if __name__ == "__main__": list1 = [1,2,3,4,5] #方法一: value = map(func1,list1) #回傳map物件,可以強制轉為list串列 print(list(value)) print("***"*20) #方法二: value = map(lambda x:x*x, list1) #回傳map物件,可以強制轉為list串列 print(list(value))
輸出結果:
x=1 x*x=1 x=2 x*x=4 x=3 x*x=9 x=4 x*x=16 x=5 x*x=25 [1, 4, 9, 16, 25] ************************************************************ [1, 4, 9, 16, 25]
值得注意的是:map函式回傳值是迭代器,注意回傳的結果只能迭代一次,如果需要多次使用請提前保存結果并處理,例如:
def func1(x): # 將每一個元素計算平方值 # print("x=%d x*x=%d"%(x,x*x)) return x*x if __name__ == "__main__": list1 = [1,2,3,4,5] value = map(func1,list1) #回傳map物件,可以強制轉為list串列 print(list(value)) print(list(value))
輸出結果:
[1, 4, 9, 16, 25] []
很懵逼是不是?明明沒什么錯誤,為什么第二次輸出就是空串列呢?因為map函式回傳的迭代器只能迭代一次,解決辦法:在獲取結果的時候強轉為 list串列 即可,實體如下:
def func1(x): # 將每一個元素計算平方值 # print("x=%d x*x=%d"%(x,x*x)) return x*x if __name__ == "__main__": list1 = [1,2,3,4,5] value = list(map(func1,list1)) #回傳map物件,可以強制轉為list串列 print(list(value)) print(list(value))
輸出:
[1, 4, 9, 16, 25] [1, 4, 9, 16, 25]
二.reduce函式
reduce函式特點:從左到右對一個序列的項累計地應用有兩個引數的函式,以此合并序列到一個單一值(例如累加或累乘串列元素等等),回傳最終的計算結果,是一個值,示例如下:
#python3在使用reduce函式時需要匯入模塊 from functools import reduce # 匯入模塊 def func1(x,y): # 把上一次計算的結果作為下一次的計算的輸入 print("x=%d y=%d x*y=%d"%(x,y,x*y)) return x*y if __name__ == "__main__": list1 = [1,2,3,4,5] #方法一: value = reduce(func1,list1) #等價 1*2*3*4*5 = 120 print(value) print(type(value)) print("***"*20) #方法二: value = reduce(lambda x,y:x*y, list1) # 等價 1*2*3*4*5 = 120 print(value) print(type(value))
輸出結果:
x=1 y=2 x*y=2 x=2 y=3 x*y=6 x=6 y=4 x*y=24 x=24 y=5 x*y=120 120 <class 'int'> ************************************************************ 120 <class 'int'>
三.filter函式
filter函式特點:對可迭代物件中的元素按照特定的條件進行篩選(例如篩選串列中所有的偶數等等),示例如下:
lis=[0,1,2,3,4,5,6] #定義篩選偶數的普通函式 def func4(x): return x%2==0 #第一種使用filter函式的方式---lambda res5=filter(lambda x:x%2==0,lis) print(list(res5)) print(list(res5)) print("***"*20) #第二種使用filter函式的方式---普通函式二 res7=filter(func4,lis) print(list(res7)) print(list(res7))
輸出結果:
[0, 2, 4, 6] [] ************************************************************ [0, 2, 4, 6] []
懵逼?事實證明,filter函式回傳的結果也和map函式一樣,只能迭代一次,解決方案和map的解決方案一樣,在獲取結果的時候強轉為 list串列 即可;
猜你喜歡:
1.python執行緒互斥鎖Lock
2.python行程互斥鎖Lock
3.python GIL鎖
4.python GIL鎖與互斥鎖Lock的區別
轉載請注明:猿說Python ? python reduce/map/filter函式區別
技術交流、商務合作請直接聯系博主 掃碼或搜索:猿說python
猿說python
微信公眾號 掃一掃關注
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/178817.html
標籤:Python
