Python3中高階函數lambda,filter,map,reduce,zip的詳細用法


在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)

 


以上就是五大高階函數的具體用法。。。希望大家可以學到一些東西。。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM