国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

Python 進(jìn)階之路 (五) map, filter, reduce, zip 一網(wǎng)打盡

ccj659 / 1927人閱讀

摘要:另外,這些中的每一個(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:
    
    [2, 3, 4, 5, 6]

這里想必聰明的你發(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
     10
zip()
函數(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

相關(guān)文章

  • Python 進(jìn)階之路 (六) 九淺一深 lambda,陳獨(dú)秀你給我坐下!

    摘要:好啦,首先讓我們先搞明白基礎(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)題,而是該不該用...

    WelliJhon 評(píng)論0 收藏0
  • Python 進(jìn)階之路 (十一) 再立Flag, 社區(qū)最全的itertools深度解析(下)

    摘要:將每一行作為返回,其中是每行中的列名。對(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)化,希望有更好主意...

    tomorrowwu 評(píng)論0 收藏0
  • Python 進(jìn)階之路 (九) 再立Flag, 社區(qū)最全的itertools深度解析(上)

    摘要:例如,以下對(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)可以大大提升工作...

    tuantuan 評(píng)論0 收藏0
  • Python進(jì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中的...

    ygyooo 評(píng)論0 收藏0
  • Python 進(jìn)階之路 (二) Dict 進(jìn)階寶典,初二快樂(lè)!

    摘要:新年快樂(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)...

    ChristmasBoy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<