摘要:另外,這些中的每一個(gè)都是純函數(shù),有返回值。例如,如果要計(jì)算整數(shù)列表的累積乘,或者求和等等基礎(chǔ)語(yǔ)法參數(shù)是連續(xù)作用于每一個(gè)元素的方法,新的參數(shù)為上一次執(zhí)行的結(jié)果,為被過(guò)濾的可迭代序列返回值最終的返回結(jié)果在中,是一個(gè)內(nèi)置函數(shù)。
簡(jiǎn)潔的內(nèi)置函數(shù)
大家好,我又回來(lái)了,今天我想和大家分享的是Python非常重要的幾個(gè)內(nèi)置函數(shù):map,filter,reduce, zip。
它們都是處理序列的便捷函數(shù)。這很大程度上歸功于函數(shù)式編程的世界。我們可以利用它們把一些小函數(shù)應(yīng)用于一個(gè)序列的所有元素。從而節(jié)省編寫(xiě)顯式循環(huán)的時(shí)間。
另外,這些中的每一個(gè)都是純函數(shù),有返回值。因此我們可以容易地將函數(shù)的返回結(jié)果用表達(dá)式來(lái)表示。
好了,又到了大白話(huà)時(shí)間,為什么用它們,就是可以簡(jiǎn)化我們的代碼,更簡(jiǎn)潔高效的執(zhí)行一些需要用到循環(huán)迭代為主的任務(wù),接下來(lái)讓我們一個(gè)個(gè)來(lái)看
map()函數(shù)構(gòu)造
map()函數(shù)的主要作用是可以把一個(gè)方法依次執(zhí)行在一個(gè)可迭代的序列上,比如List等,具體的信息如下:
基礎(chǔ)語(yǔ)法:map(fun, iterable)
參數(shù):fun是map傳遞給定可迭代序列的每個(gè)元素的函數(shù)。iterable是一個(gè)可以迭代的序列,序列中的每一個(gè)元素都可以執(zhí)行fun
返回值:map object
好了,大白話(huà)就是利用map我們可以把一個(gè)函數(shù)fun 執(zhí)行到序列iter的每一個(gè)元素上,用例子非常好理解~
基礎(chǔ)用法:
下面先讓我們看一個(gè)小例子,假設(shè)現(xiàn)在我們有一個(gè)List,包含1~5五個(gè)數(shù)字,我們想要讓每一個(gè)數(shù)+1,如果不知道m(xù)ap這個(gè)函數(shù)之前,我們的解決方案是這樣的:
numbers = [1, 2, 3, 4, 5] for i in range(0,len(numbers)): #對(duì)每個(gè)元素加1 numbers[i]+=1 print(numbers) Out:[2, 3, 4, 5, 6]
或者是這樣的:
numbers = [1, 2, 3, 4, 5] result = [] for n in numbers: result.append(n+1) print(result) Out:[2, 3, 4, 5, 6]
但是顯然,無(wú)論怎么做都會(huì)涉及到寫(xiě)循環(huán),這里就是map函數(shù)的用武之地了,我們可以用map函數(shù)這樣實(shí)現(xiàn):
def add_one(n): return n + 1 numbers = [1, 2, 3, 4, 5] result = map(add_one, numbers) print(result) print(type(result)) print(list(result)) Out:
這里想必聰明的你發(fā)現(xiàn)了map的好處,在優(yōu)化精簡(jiǎn)代碼的同時(shí),某種程度上講實(shí)現(xiàn)了方法和循環(huán)部分的分離,這里我們可以發(fā)現(xiàn)map返回就是map類(lèi),我們這里傳遞的序列是List,最后輸出時(shí)經(jīng)過(guò)類(lèi)型轉(zhuǎn)換也是list
在傳遞序列時(shí)只要這個(gè)序列是可迭代的就好,不一定非要List,比如我們換一種:
def add_one(n): return n + 1 numbers = (1, 2, 3, 4, 5) #序列為元組 result = map(add_one, numbers) print(tuple(result)) # Out:(2, 3, 4, 5, 6)
輸入的序列為同樣可以迭代的元組,輸出時(shí)我們也選擇元組,效果一樣的。
更進(jìn)一步
還用剛才的例子,為了更加簡(jiǎn)潔,我們可以用lambda函數(shù)配合map使用,具體實(shí)現(xiàn)如下:
numbers = (1, 2, 3, 4, 5) # 迭代對(duì)象為tuple result = map(lambda x: x + 1, numbers) print(list(result)) # 輸出對(duì)象為list Out:[2, 3, 4, 5, 6]
更加簡(jiǎn)潔優(yōu)雅了對(duì)吧!!這個(gè)lambad函數(shù)我之后會(huì)說(shuō),今天它不是主角哈哈,先一帶而過(guò)。
讓我們重新把目光轉(zhuǎn)移到map上來(lái),除了剛才的用法,還要一種情況也十分常見(jiàn),讓我們看下面的例子:
# List of strings words = ["paris", "xiaobai","love"] # 把數(shù)組中每個(gè)元素變?yōu)長(zhǎng)ist test = list(map(list, words)) print(test) Out: [["p", "a", "r", "i", "s"], ["x", "i", "a", "o", "b", "a", "i"], ["l", "o", "v", "e"]]
words是一個(gè)只包含字符串類(lèi)型元素的list,我們用map可以實(shí)現(xiàn)將words的每一個(gè)元素全部轉(zhuǎn)化為list類(lèi)型,這里有一點(diǎn)一定要注意,能實(shí)現(xiàn)的前提一定是每個(gè)元素都是可以迭代的類(lèi)型,如果出現(xiàn)了如int類(lèi)型的元素,就會(huì)出錯(cuò)啦:
# List of strings words = [18,"paris", "xiaobai","love"] # 把數(shù)組中每個(gè)元素變?yōu)長(zhǎng)ist test = list(map(list, words)) print(test) Out:TypeError: "int" object is not iterable
大家一看錯(cuò)誤類(lèi)型相比立刻就明白啦,所以正確的使用方法一定是類(lèi)似這種:
nums = [3,"23",-2] print(list(map(float,nums))) Out: [3.0, 23.0, -2.0]
總之就是類(lèi)型要注意,今天我就拋磚引玉簡(jiǎn)單介紹一下map,具體的用法大家可以自行開(kāi)發(fā)哈,我也在不斷學(xué)習(xí)中
filter()函數(shù)構(gòu)造
filter()方法借助于一個(gè)函數(shù)來(lái)過(guò)濾給定的序列,該函數(shù)測(cè)試序列中的每個(gè)元素是否為真。
基礎(chǔ)語(yǔ)法:filter(fun, iterable)
參數(shù):fun測(cè)試iterable序列中的每個(gè)元素執(zhí)行結(jié)果是否為T(mén)rue,iterable為被過(guò)濾的可迭代序列
返回值:可迭代的序列,包含元素對(duì)于fun的執(zhí)行結(jié)果都為T(mén)rue
簡(jiǎn)而言之就是filter可以幫助我們根據(jù)給出的條件過(guò)濾一組數(shù)據(jù)并返回結(jié)果
基礎(chǔ)用法:
讓我們先看一個(gè)例子:
# 過(guò)濾元音的方法 def fun(variable): letters = ["a", "e", "i", "o", "u"] if (variable in letters): return True else: return False # 給定序列 sequence = ["I", "l", "o", "v", "e", "p", "y","t","h","o","n"] # 根據(jù)條件得出結(jié)果 filtered = list(filter(fun, sequence)) print(filtered) Out:["o", "e", "o"]
這里我們創(chuàng)建一個(gè)可以提取元音字母的方法fun,給定的可迭代序列為list,之后就可以用filter方法很容易的提取出結(jié)果啦,再看一個(gè)類(lèi)似例子:
# 判斷為正數(shù) def positive(num): if num>0: return True else: return False #判斷偶數(shù) def even(num): if num % 2==0: return True else: return False numbers=[1,-3,5,-20,0,9,12] positive_nums = list(filter(positive, numbers)) print(positive_nums) # 輸出正數(shù) list even_nums = tuple(filter(even,numbers)) print(even_nums) #輸出偶數(shù) tuple Out:[1, 5, 9, 12] (-20, 0, 12)
看到這里相比大家已經(jīng)知道filter的基礎(chǔ)用法啦, 要先有一個(gè),能返回True或者False的方法,或者表達(dá)式作為過(guò)濾條件就行啦
更進(jìn)一步
這里其實(shí)和map一樣了,基本上最簡(jiǎn)潔的用法都是和lambda混在一起,比如下面我們想要把剛才的一大串代碼壓縮一下:
numbers = [0, 1, 2, -3, 5, -8, 13] # 提取奇數(shù) result = filter(lambda x: x % 2, numbers) print("Odd Numbers are :",list(result)) # 提取偶數(shù) result = filter(lambda x: x % 2 == 0, numbers) print("Even Numbers are :",list(result)) #提取正數(shù) result = filter(lambda x: x>0, numbers) print("Positive Numbers are :",list(result)) Out:Odd Numbers are : [1, -3, 5, 13] Even Numbers are : [0, 2, -8] Positive Numbers are : [1, 2, 5, 13]
" 爽啊!爽死了!" 郭德綱看到后這么評(píng)價(jià),lambda我平時(shí)用的不多,但是寫(xiě)到這里,我也覺(jué)得要好好學(xué)習(xí)它了,畢竟和其他編程語(yǔ)言相比,可能這中用法才是python提倡的理念之一:高效簡(jiǎn)潔,
reduce()函數(shù)構(gòu)造
Reduce是一個(gè)非常有用的函數(shù),用于在列表上執(zhí)行某些計(jì)算并返回結(jié)果。它將滾動(dòng)計(jì)算應(yīng)用于列表中的連續(xù)值。例如,如果要計(jì)算整數(shù)列表的累積乘,或者求和等等
基礎(chǔ)語(yǔ)法:reduce(function, iterable)
參數(shù):fun是連續(xù)作用于iterable每一個(gè)元素的方法,新的參數(shù)為上一次執(zhí)行的結(jié)果,iterable為被過(guò)濾的可迭代序列
返回值:最終的function返回結(jié)果
在Python 2中,reduce()是一個(gè)內(nèi)置函數(shù)。但是,在Python 3中,它被移動(dòng)到functools模塊。因此,要使用前我們需要導(dǎo)入,這里我的環(huán)境是Python 3.6
基礎(chǔ)用法:
先看一個(gè)求累加和的小栗子:
from functools import reduce # Python 3 def do_sum(x1, x2): return x1 + x2 print(reduce(do_sum, [1, 2, 3, 4])) Out:10
再看一個(gè)累積乘法的例子:
from functools import reduce # Python 3 def multiply(x, y): return x*y numbers = [1,2,3,4] print(reduce(multiply, numbers)) Out:24
更進(jìn)一步:
還是和lambda混搭,更加簡(jiǎn)潔:
from functools import reduce # Python 3 numbers = [1,2,3,4] result_multiply = reduce((lambda x, y: x * y), numbers) result_add = reduce((lambda x,y: x+y), numbers) print(result_multiply) print(result_add) Out:24 10zip()
函數(shù)構(gòu)造
zip()的目的是映射多個(gè)容器的相似索引,以便它們可以?xún)H作為單個(gè)實(shí)體使用。
基礎(chǔ)語(yǔ)法:zip(*iterators)
參數(shù):iterators為可迭代的對(duì)象,例如list,string
返回值:返回單個(gè)迭代器對(duì)象,具有來(lái)自所有容器的映射值
基礎(chǔ)用法:
其實(shí)之前我們?cè)谥vdict的創(chuàng)建方法時(shí)提到過(guò)它,這里從新回顧一下:
keys = ["name","age"] values = ["xiaobai",18] my_dict = dict(zip(keys,values)) print(my_dict) Out:{"name": "xiaobai", "age": 18}
zip可以支持多個(gè)對(duì)象,比如下面的例子
name = [ "xiaobai", "john", "mike", "alpha" ] age = [ 4, 1, 3, 2 ] marks = [ 40, 50, 60, 70 ] # using zip() to map values mapped = list(zip(name, age, marks)) print ("The zipped result is : "mapped) Out:The zipped result is : [("xiaobai", 4, 40), ("john", 1, 50), ("mike", 3, 60), ("alpha", 2, 70)]
這里我們可以很容易的的把name,age,marks這三個(gè)list里面相同index的值映射打包在一起
更進(jìn)一步:
通過(guò)上面的例子,我們發(fā)現(xiàn)可以很容易的以類(lèi)似1對(duì)1的形式把不同對(duì)象的同一索引位置的值打包起來(lái),那如果是解包呢?也是類(lèi)似的,就是多了一個(gè) * 而已
names, ages, marks = zip(*mapped) print ("The name list is : ",names) print ("The age list is : ",ages) print ("The marks list is : ",marks) Out: The name list is : ("xiaobai", "john", "mike", "alpha") The age list is : (4, 1, 3, 2) The marks list is : (40, 50, 60, 70)總結(jié)
今天主要為大家介紹了map,filter,reduce,zip四個(gè)高效的python內(nèi)置函數(shù)的用法,我也是剛剛接觸,了解不夠深入,如果介紹的有錯(cuò)誤或者歧義還請(qǐng)大家多多諒解和包容,如果有大神可以進(jìn)一步補(bǔ)充說(shuō)明一定要寫(xiě)個(gè)評(píng)論呀,讓我們一起進(jìn)步。
最后為大家講個(gè)悲傷的故事:
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/43146.html
摘要:好啦,首先讓我們先搞明白基礎(chǔ)定義,到底是什么表達(dá)了中用于創(chuàng)建匿名函數(shù)的特殊語(yǔ)法。其實(shí)總結(jié)起來(lái),可以理解為一個(gè)小的匿名函數(shù),函數(shù)可以使用任意數(shù)量的參數(shù),但只能有一個(gè)表達(dá)式。 lambda是什么 大家好,今天給大家?guī)?lái)的是有關(guān)于Python里面的lambda表達(dá)式詳細(xì)解析。lambda在Python里面的用處很廣,但說(shuō)實(shí)話(huà),我個(gè)人認(rèn)為有關(guān)于lambda的討論不是如何使用的問(wèn)題,而是該不該用...
摘要:將每一行作為返回,其中是每行中的列名。對(duì)于每一行,都會(huì)生成一個(gè)對(duì)象,其中包含和列中的值。它返回一個(gè)迭代器,是迭代結(jié)果都為的情況。深度解析至此全劇終。 簡(jiǎn)單實(shí)戰(zhàn) 大家好,我又來(lái)了,在經(jīng)過(guò)之前兩篇文章的介紹后相信大家對(duì)itertools的一些常見(jiàn)的好用的方法有了一個(gè)大致的了解,我自己在學(xué)完之后仿照別人的例子進(jìn)行了真實(shí)場(chǎng)景下的模擬練習(xí),今天和大家一起分享,有很多部分還可以?xún)?yōu)化,希望有更好主意...
摘要:例如,以下對(duì)兩個(gè)的相應(yīng)元素求和這個(gè)例子很好的解釋了如何構(gòu)建中所謂的迭代器代數(shù)的函數(shù)的含義。為簡(jiǎn)單起見(jiàn),假設(shè)輸入的長(zhǎng)度可被整除。接受兩個(gè)參數(shù)一個(gè)可迭代的正整數(shù)最終會(huì)在中個(gè)元素的所有組合的元組上產(chǎn)生一個(gè)迭代器。 前言 大家好,今天想和大家分享一下我的itertools學(xué)習(xí)體驗(yàn)及心得,itertools是一個(gè)Python的自帶庫(kù),內(nèi)含多種非常實(shí)用的方法,我簡(jiǎn)單學(xué)習(xí)了一下,發(fā)現(xiàn)可以大大提升工作...
摘要:用匿名函數(shù)有個(gè)好處,因?yàn)楹瘮?shù)沒(méi)有名字,不必?fù)?dān)心函數(shù)名沖突。和不同的是,把傳入的函數(shù)依次作用于每個(gè)元素,然后根據(jù)返回值是還是決定保留還是丟棄該元素。字符串給出當(dāng)前平臺(tái)使用的行終止符。程序中間的退出,為正常退出。 列表生成式 函數(shù)的參數(shù)類(lèi)型 lambda函數(shù) map, reduce, filter, sorted函數(shù) eval, exec, join, zip函數(shù) itertools中的...
摘要:新年快樂(lè)大家好,今天是大年初二,身在國(guó)外沒(méi)有過(guò)年的氛圍,只能踏實(shí)寫(xiě)寫(xiě)文章,對(duì)社區(qū)做點(diǎn)貢獻(xiàn),在此祝大家新年快樂(lè)上一期為大家梳理了一些的進(jìn)階用法,今天我們來(lái)看字典的相關(guān)技巧,我個(gè)人在編程中對(duì)字典的使用非常頻繁,其實(shí)對(duì)于不是非常大的數(shù)據(jù)存儲(chǔ)需求, 新年快樂(lè) 大家好,今天是大年初二,身在國(guó)外沒(méi)有過(guò)年的氛圍,只能踏實(shí)寫(xiě)寫(xiě)文章,對(duì)社區(qū)做點(diǎn)貢獻(xiàn),在此祝大家新年快樂(lè)!上一期為大家梳理了一些List的進(jìn)...
閱讀 1644·2021-11-24 09:39
閱讀 3083·2021-11-22 15:24
閱讀 3091·2021-10-26 09:51
閱讀 3276·2021-10-19 11:46
閱讀 2891·2019-08-30 15:44
閱讀 2217·2019-08-29 15:30
閱讀 2537·2019-08-29 15:05
閱讀 773·2019-08-29 10:55