Python3高階函式lambda,filter,map,reduce,zip詳解
阿新 • • 發佈:2019-01-08
在Python裡有五大高階函式,他們分別是lambda()匿名函式,filter()篩選函式,map()函式,reduce()函式,zip()函式。下面就讓我們來詳細的瞭解一下這五種函式的具體用法吧。
1.lambda()匿名函式
匿名函式lambda:是指一類無需定義識別符號(函式名)的函式或子程式。 lambda 函式可以接收任意多個引數 (包括可選引數) 並且返回單個表示式的值。 要點: 1,lambda 函式不能包含命令, 2,包含的表示式不能超過一個。 說明:一定非要使用lambda函式;任何能夠使用它們的地方,都可以定義一個單獨的普通函式來進行替換。 我將它們用在需要封裝特殊的、非重用程式碼上,避免令我的程式碼充斥著大量單行函式。 lambda匿名函式的格式:冒號前是引數,可以有多個,用逗號隔開,冒號右邊的為表示式。 其實lambda返回值是一個函式的地址,也就是函式物件。
''' 匿名函式lambda:是指一類無需定義識別符號(函式名)的函式或子程式。 lambda 函式可以接收任意多個引數 (包括可選引數) 並且返回單個表示式的值。 要點: 1,lambda 函式不能包含命令, 2,包含的表示式不能超過一個。 說明:一定非要使用lambda函式;任何能夠使用它們的地方,都可以定義一個單獨的普通函式來進行替換。 我將它們用在需要封裝特殊的、非重用程式碼上,避免令我的程式碼充斥著大量單行函式。 lambda匿名函式的格式:冒號前是引數,可以有多個,用逗號隔開,冒號右邊的為表示式。 其實lambda返回值是一個函式的地址,也就是函式物件。 ''' def sum(x,y): return x+y print(sum(4,6)) f=lambda x,y:x+y print(f(4,6)) #這倆個例子的效果是一樣的,都是返回x+y a=lambda x:x*x print(a(4)) #傳入一個引數的lambda函式 返回x*x b=lambda x,y,z:x+y*z print(b(1,2,3)) #返回x+y*z 即1+2*3=7 #2.方法結合使用 from functools import reduce foo=[2, 18, 9, 22, 17, 24, 8, 12, 27] print(list(filter(lambda x:x%3==0,foo))) #篩選x%3==0 的元素 print(list(map(lambda x:x*2+10,foo))) #遍歷foo 每個元素乘2+10 再輸出 print(reduce(lambda x,y:x+y,foo)) #返回每個元素相加的和
2.filter函式()
filter() 函式是一個對於可迭代物件的過濾器,過濾掉不符合條件的元素, 返回的是一個迭代器,如果要轉換為列表,可以使用 list() 來轉換。 該函式接收兩個引數,第一個為函式的引用或者None,第二個為可迭代物件, 可迭代物件中的每個元素作為引數傳遞給函式進行判,然後返回 True 或 False,最後將返回 True 的元素放到迭代器中 下面看下fiter()的用法:
''' filter() 函式是一個對於可迭代物件的過濾器,過濾掉不符合條件的元素, 返回的是一個迭代器,如果要轉換為列表,可以使用 list() 來轉換。 該函式接收兩個引數,第一個為函式的引用或者None,第二個為可迭代物件, 可迭代物件中的每個元素作為引數傳遞給函式進行判,然後返回 True 或 False,最後將返回 True 的元素放到迭代器中 下面看下fiter()的用法: ''' my_list=[1,2,'',3,4,'6',' '] new_list=list(filter(None,my_list)) print(new_list) #None 函式 過濾掉'' 而不是過濾掉空字串 def is_oushu(x): return x%2==0 new_list=list(filter(is_oushu,list(range(1,11)))) print(new_list) #過濾掉不是偶數的數 a=[1,2,3,4,5,6,2,2,2,] print(list(filter(lambda x:x!=2,a))) #篩選出列表裡所有的不是 2 的元素
3.map函式詳解
map()函式 map()是 Python 內建的高階函式,它接收一個函式 f 和一個 list, 並通過把函式 f 依次作用在 list 的每個元素上,得到一個新的 list 並返回。 例如,對於list [1, 2, 3, 4, 5, 6, 7, 8, 9] 如果希望把list的每個元素都作平方,就可以用map()函式: 因此,我們只需要傳入函式f(x)=x*x,就可以利用map()函式完成這個計算:
'''
map()函式
map()是 Python 內建的高階函式,它接收一個函式 f 和一個 list,
並通過把函式 f 依次作用在 list 的每個元素上,得到一個新的 list 並返回。
例如,對於list [1, 2, 3, 4, 5, 6, 7, 8, 9]
如果希望把list的每個元素都作平方,就可以用map()函式:
因此,我們只需要傳入函式f(x)=x*x,就可以利用map()函式完成這個計算:
'''
list=[1,2,3,4,5,6,7,8,9]
def f(x):
return x*x
list1=map(f,list)
print(list1)
for i in list1:
print(i)
'''
注意:map()函式不改變原有的 list,而是返回一個新的 list。
利用map()函式,可以把一個 list 轉換為另一個 list,只需要傳入轉換函式。
由於list包含的元素可以是任何型別,因此,map() 不僅僅可以處理只包含數值的 list,
事實上它可以處理包含任意型別的 list,只要傳入的函式f可以處理這種資料型別。
任務
假設使用者輸入的英文名字不規範,沒有按照首字母大寫,後續字母小寫的規則,
請利用map()函式,把一個list(包含若干不規範的英文名字)變成一個包含規範英文名字的
'''
def format_name(s):
s1=s[0:1].upper()+s[1:].lower()
return s1
names=['adam', 'LISA', 'barT']
print (map(format_name, names)) #python2 這樣寫可以直接輸出列表
for i in map(format_name,names):
print(i) #python3 得這樣寫才可以
4.reduce函式詳解
在python3中如果使用reduce需要先匯入 from functools import reduce reduce函式,reduce函式會對引數序列中元素進行累積。 reduce函式的定義: reduce(function, sequence [, initial] ) -> value function引數是一個有兩個引數的函式,reduce依次從sequence中取一個元素, 和上一次呼叫function的結果做引數再次呼叫function。 第一次呼叫function時,如果提供initial引數, 會以sequence中的第一個元素和initial作為引數呼叫function, 否則會以序列sequence中的前兩個元素做引數呼叫function。
'''
在python3中如果使用reduce需要先匯入
from functools import reduce
reduce函式,reduce函式會對引數序列中元素進行累積。
reduce函式的定義:
reduce(function, sequence [, initial] ) -> value
function引數是一個有兩個引數的函式,reduce依次從sequence中取一個元素,
和上一次呼叫function的結果做引數再次呼叫function。
第一次呼叫function時,如果提供initial引數,
會以sequence中的第一個元素和initial作為引數呼叫function,
否則會以序列sequence中的前兩個元素做引數呼叫function。
'''
from functools import reduce
lst=[1,2,3,4,5,6]
def f(x,y):
return x+y
print(reduce(f,lst))
'''
過程1+2+3+4+5+6=21
'''
print(reduce(lambda x,y:x*y,lst))
# 執行過程為1*2*3*4*5*6=720
#來個稍微複雜的
print(reduce(lambda x,y:x*y+1,lst))
'''
運算步驟:1*2+1=3
3*3+1=10
10*4+1=41
41*5+1=206
206*6+1=1237
'''
#再說說有初始化值的情況, 這個時候就不是取列表的前兩項, 而是取初始值為第一個,
# 序列的第一個元素為第二個元素,開始進行lambda函式的應用計算.
print(reduce(lambda x,y:x+y,lst,5))
'''
計算步驟:5+1=6
6+2=8
8+3=11
11+4=15
15+5=20
20+6=26
'''
5.zip函式詳解
#zip函式接受任意多個可迭代物件作為引數,將物件中對應的元素打包成一個tuple,然後返回一個可迭代的zip物件. #這個可迭代物件可以使用迴圈的方式列出其元素 #若多個可迭代物件的長度不一致,則所返回的列表與長度最短的可迭代物件相同.
#zip函式接受任意多個可迭代物件作為引數,將物件中對應的元素打包成一個tuple,然後返回一個可迭代的zip物件.
#這個可迭代物件可以使用迴圈的方式列出其元素
#若多個可迭代物件的長度不一致,則所返回的列表與長度最短的可迭代物件相同.
#1.用列表生成zip物件
x=[1,2,3]
y=[4,5,6]
z=[7,8,9]
h=['a','b','c','d']
zip1=zip(x,y,z)
print(zip1)
for i in zip1:
print(i)
zip2=zip(x,y,h)
for i in zip2:
print(i)
zip3=zip(h)
for i in zip3:
print(i)
zip4=zip(*h*3)
for i in zip4:
print(i) #這是幹啥喲。。
print('==*=='*10)
#2.二維矩陣變換
l1=[[1,2,3],[4,5,6],[7,8,9]]
print(l1)
print([[j[i] for j in l1] for i in range(len(l1[0])) ])
zip5=zip(*l1)
for i in zip5:
print(i)
以上就是五大高階函式的具體用法。。。希望大家可以學到一些東西。。。