map 长度_Python实用教程系列——高阶函数Map、Filter、Reduce
點擊上方藍色文字關注我們吧
有你想要的精彩
作者 | 那個百分十先生出品 | Python知識學堂上次推文我們介紹了python中的《Logging日志模塊》的相關知識,這次推文我們將學習一下python中的高階函數等相關的知識,這些高階函數我們是非常常見的,比如我們經常使用的Map、Filter、Reduce。
定義
在學習python的基礎知識的時候,我們可能會學到一個概念“函數式編程”,我們來看看百度百科的介紹:
"函數式編程"是一種"編程范式"(programming paradigm),也就是如何編寫程序的方法論。它屬于"結構化編程"的一種,主要思想是把運算過程盡量寫成一系列嵌套的函數調用。也就是說函數式編程有這樣的特點:
函數可作為對象可以賦值給變量。
函數可作為參數傳遞給另一個函數。
函數可作為一個參數返回。
那么高階函數的定義是什么呢?簡單的來說,只要滿足一下的條件就可以認為這個函數是高階函數:
函數可以作為參數傳給另外一個函數;
函數的返回值為另外一個函數;
當然了,若一個函數的返回值為該函數本身的話,很顯然就這就是我們常見的遞歸。
我們來看看幾個簡單的例子:
#?例1?函數作為參數傳給另外一個函數def?print_1():
???print("打印1")
def?print_2(print_1):
???#?調用print_1()函數
???print_1()
???print("打印2")
???print("打印結束")#?函數調用,參數為print_1()函數
print_2(print_1)
#例2
#返回值為一個函數
def?print_1():
???print("我愛python")
def?print_2():
???print("我愛python知識學堂")#?返回值為一個函數return(print_1())#?函數調用
print_2()
Map
Map()是python內置函數,它會根據所傳遞的函數對指定的序列(可迭代)做映射,原型如下:
map(func, *iterables) --> map object
參數function:是一個函數,是自定義或者python內置的函數都可以。
參數*iterable:是可迭代的對象,比如我們常用的列表,元組等。
返回值map object:表示map函數的返回值是一個map對象。
簡單的來說這個Map函數的功能就是使用func對傳入的iterable的每一個元素(比如列表的每一個元素)進行處理,返回對象如
注意到參數iterable是加了符號“*”的,所以說這個參數的意思是可以接受多個可迭代的對象的。接下來我們看幾個例子:
Function為內置函數
string_1?=?'Python知識學堂'???????? #字符串string_2?=?[1,2,3,4,5,6]???????????? #列表
string_3?=?{'python':2,'學習':3,1:4}? #字典
res1?=?map(str,string_1)
res2?=?map(str,string_2)
res3?=?map(str,string_3)
print(string_1)
print(list(res1))
print(list(res2))
print(list(res3))
上述例子使用python的內置函數str()將字符串和列表的每個元素變成了str類型,根據map函數的說明我們知道res1和res2是一個Iterator,Iterator是惰性可迭代序列,因此通過list()函數將值求出來,注意,map不改變原list。
關于迭代器的惰性計算,這里先引用網上的一句話:
“迭代器的一個優點就是它不要求你事先準備好整個迭代過程中所有的元素。迭代器僅僅在迭代至某個元素時才計算該元素,而在這之前或之后,元素可以不存在或者被銷毀。這個特點使得它特別適合用于遍歷一些巨大的或是無限的集合,比如幾個G的文件,或是斐波那契數列等等。這個特點被稱為延遲計算或惰性求值(Lazy evaluation)。”Function為自定義函數
上述使用的是python的內置函數str(),實際的項目中我們更多的是傳入自定義的函數:
def?self_test(x):return?x?+?2string?=?[1,2,3,4,5,6]
res?=?map(self_test,?string)
print(list(res))#輸出?[3,?4,?5,?6,?7,?8]
上述代碼中 向map函數中傳入了自定義的self_test函數,函數加對傳入的元素加2的處理,理解起來還是很簡單的。
多個Iterable
之前說過,參數*iterable可以是多個可迭代對象的,我們來一探究竟:
def?func(x,y,z):return?x**2,?y**2,?z**2List1?=?[1,?2]
List2?=?[1,?2,?3,?4]
List3?=?[1,?2,?3,?4,?5]
res?=?map(func,?List1,?List2,?List3)
print(list(res))#輸出?[(1,?1,?1),?(4,?4,?4)]
可以看出,map()函數中傳入了多個iterable。輸出的結果中列表的長度為2。這是為什么?很簡單,這里有一個知識點:輸出的list的長度取決于*iterable中傳入的litrable的最小長度,比如在上述中List1、List2和List3中最短的為List1,長度為2。
For循環取內容
我們知道,map()函數的返回為一個map對象,如:
我們之前的操作是使用list輸出里面的內容的,實際上我們也可以使用for循環遍歷的方式取值:
#for循環來取出內容def?add_test(x):return?x?+?2
string?=?[1,2,3,4,5,6]
res?=?map(add_test,?string)
res_ls=[]for?i?in?res:
???res_ls.append(i)
print(res_ls)
輸出的結果跟上述一樣,就不多分析了,有的小伙伴學習到這,就在想我們自己該怎么實現?
map()函數的功能呢?其實也不太難,我們接著看。
自實現Map()功能
def?add_test(x):return?x?+?2#?實現map()函數功能def?self_map(function,iterable):str_1=[]for?each?in?iterable:each_num?=?function(each)str_1.append(each_num)return?str_1.__iter__()string?=?[1,2,3,4,5,6]result?=?self_map(add_test,string)print(list(result))
上述代碼的輸出為:[3, 4, 5, 6, 7, 8],且完成了map函數的功能了。小伙伴們可能對代碼代碼str_1.__iter__()比較好奇,這個代碼的功能就是將str_1轉換為迭代器對象。
map()函數我們就介紹到這,接下來來看另一個高階函數filter()。
Filter
看到這個函數的名字大家就知道其功能大概就是來過濾一些什么的,那具體是怎樣的呢?
filter()是python內置函數,它會根據所傳遞的函數對指定的對象(可迭代)做過濾,原型如下:
filter(function or None, iterable) --> filter object
可以看出該函數接收兩個參數,第一個為函數,第二個為可迭代對象,序列的每個元素作為參數傳遞給函數進行判斷,然后返回 True 或 False,最后將返回 True 的元素放到新列表(或迭代器)中。
Filter()實例
我們來看實例,注意filter()函數的返回時filter可迭代的對象,如:
,所以在輸出的時候需要使用list()函數轉換一下,當然了也可以使用for循環來取值。
def?select_element(string):if?'p'?in?string:return?True???????#?return?1else:return?False
???????#?return?0
res_1?=?filter(select_element,??['1','2','3','python'])
res_2?=?filter(select_element,?{'python':1,'知識':2,'學堂':3})
print(list(res_1))
print(list(res_2))#?輸出均為
#?['python']
#?['python']
自實現Filter()功能
跟map()一樣,我們自己來實現filter()的功能:
#?自實現filte()函數功能def?select_element(string):if?'p'?in?string:return?True
???????#?return?1else:return?False
???????#?return?0
def?filter_test(function,iterable):str_1=[]for?each?in?iterable:if?function(each):str_1.append(each)return?str_1string?=?['1','2','3','python']res1?=?filter_test(select_element,string)res2?=?filter_test(lambda?x:x=='python',string)print(res1)print(res2)
輸出結果跟之前的一樣,其中
res2 = filter_test(lambda x:x=='python',string)中使用了lambda函數,我們以后再具體介紹這類函數的使用。filter()函數我們就介紹到這,接下來來看另一個高階函數reduce ()。
Reduce
跟map()、filter()類似,reduce()是一個以函數以及sequence為參數的高階函數,其返回值為一個value值而不是迭代器對象。其原型如下:
reduce(function, sequence[, initial]) -> value
但reduce()傳入的函數必須接收兩個參數,比如func (x,y)滿足條件,但是func(x,y,z)并不滿足條件。
Initial為初始化的一個參數,可不填。(如果沒有指定Initial的值那么其為sequence的第一個元素的值)。
Reduce()實例
在看reduce()函數的實例之前,我們來看一個圖解釋一下reduce的執行過程:
看圖很簡單:reduce每一次迭代,都將上一次的迭代結果與下一個元素一起傳入function函數中,取得值以后將其與下一個元素一起繼續下傳…找到使用到sequence中的最后一個元素。
我們來看一個使用reduce()函數的實例:
#?需要functools從導入from?functools?import?reducedef?func(x,?y):return?x?+?y
string?=??[1,?3,?5,?7,?9]
result_1?=?reduce(func,string)
result_2?=?reduce(func,string,100)
print(result_1)
print(result_2)
上述代碼輸出為:25和125,result_2使用initial = 100。
其中25的值可以這樣理解:25 = ((((1+3)+5)+7)+9)
其中125的值可以這樣理解:125 = (((((100+1)+3)+5)+57)+9)
其實上述reduce的計算過程還是比較好理解的,其實在Python中還有一個函數sum(),可以直接求職的,具體的求值語句:res = sum(string)。
自實現Reduce()功能
Reduce函數自定義實現也比較簡單,我們來看看這個實現怎么寫:
def?func(x,?y):return?x?+?ydef?self_reduce(function,?string,?initializer=None):it?=?iter(string)if?initializer?is?None:value?=?next(it)else:value?=?initializerfor?each_ele?in?it:value?=?function(value,?each_ele)return?valuestring?=?{1,?3,?5,?7,?9}#?string?=?[1,?3,?5,?7,?9]
result_1?=?self_reduce(func,string)
result_2?=?self_reduce(func,string,100)
print(result_1)
print(result_2)
輸出結果跟上述一樣,這里的string = {1, 3, 5, 7, 9}是一個集合,即傳入的是一個集合,當然了string = [1, 3, 5, 7, 9]也是可以的。
或者使用以下的方法實現Reduce()方法的功能也是可以的:
def?func(x,?y):return?x?+?ydef?self_reduce(function,?iterable,?initializer=None):if?initializer?is?None:value?=iterable.pop(0)else:value=initializerfor?each_ele?in?iterable:value=function(value,each_ele)return?valuestring?=?{1,?3,?5,?7,?9}
result_1?=?self_reduce(func,string,100)
print(result_1)
輸出結果為:125
總結
以上就是本次推文的所有內容啦!主要講的是Python中的高階函數,具體的內容涉及到高階函數的定義和概念,具體的講解了三個常用的高階函數:map,filter,reduce的使用方法,同時也講解了如何自己實現這三者的功能,這個自己實現三者功能的方法大家可以好好研究下。
在實際的工程項目中,運用好這些方法,不僅會減少代碼量,而且在很大的程度上還能加速代碼的運行速度。
最后,感謝大家的關注,如果覺得作者寫得還不錯的話,歡迎三連點贊分享再看支持,您的支持是我寫作的最大動力,謝謝!
往期精選(?猛戳可查看)
Python實用教程系列——Logging日志模塊
點贊和在看一下吧
總結
以上是生活随笔為你收集整理的map 长度_Python实用教程系列——高阶函数Map、Filter、Reduce的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python listbox输入内容自动
- 下一篇: svm 交叉验证 python_【pyt