3.python中map,filter,reduce以及內部實現原理剖析

來源:互聯網
上載者:User

標籤:map   python   filter   reduce   

一.map函數,對任何可迭代序列中的每一個元素應用對應的函數。(不管處理的是什麼類型的序列,最後返回的都是列表。)

作用已經在標題中介紹過了,那麼先來說說map函數的用法吧。

map(處理邏輯可以是函數也可以是lambda運算式,可迭代的序列)

現在有一個列表。

l1 = [1,2,3,4,5]

現在需要給這個列表裡的每一個元素都+1。(當然,使用for迴圈可以做到對序列中的每個元素進行處理,但使用map函數會更加方便。)

首先,定義一個邏輯函數,要如何對序列中的每一個元素進行處理。

def plus(x):

    return x + 1

#每個元素都+1

print map(plus,l1)

#將map函數應用到l1的每一個元素中。

輸出的結果為。

>>>[2, 3, 4, 5, 6]


當然,傳入map函數中的邏輯函數還可以使用lambda運算式來表示,還拿剛才的例子示範。

l1 = [1,2,3,4,5]

print map(lambda x:x+1,l1)

>>>[2, 3, 4, 5, 6]


那麼map函數是怎麼做到的?內部功能是如何?的?下面就來對map函數的內部進行剖析。

下面這個函數就可以實現和python內建的map函數一模一樣的功能。

def map_func(func,seq):

    map_list = []

    for i in seq:

        map_list.append(func(i))

    return map_list


注意!上面說的map函數的使用方法是針對python2.7版本的,針對python3以上的版本不適用,因為從python3開始,map函數不再返回列表,返回的則是一個迭代器,如果想變成列表的話,還需要使用list() 函數做一個轉換。



二.filter函數,對序列中的元素進行判斷篩選。(返回的結果依舊是個列表。)

fileter函數在拿到一個序列的時候,會開始迴圈迭代這個序列中的每一個元素,對每一個元素都進行一次if判斷,結果為True的加入到列表中,為False的,直接丟掉。

下面是filter函數的簡單用法。

一個列表,將這個列表中小於5的元素,全部都列出來。(當然...這麼簡單的需求也可以使用for迴圈實現)

filter函數用法和map函數一樣都是 filter(函數,可迭代序列)

l1 = [1,2,3,4,5,6,7,8,9,10]


def greater_than(x):

    if x < 5:

        return True

    else:

        return False


print filter(greater_than,l1)

>>>[1, 2, 3, 4]


filter函數依舊可以使用lambda運算式來代替邏輯函數。

print filter(lambda x:x<5,l1)


下面來剖析一下filter函數的工作原理,自己手動寫一個和filter功能一模一樣的函數:

def filter_func(func,seq):

    filter_list = []

    for s in seq:

        if func(s):

            filter_list.append(s)

    return filter_list


注意啦!這裡面的filter函數和map函數一樣,用法都是針對python2.7的,在python3中對這個函數做了一些改動,返回的不再是個列表,而是個迭代器。


三.reduce函數,將序列中所有的元素進行合并運算。

現在有個列表,現在需要每個元素要逐個相乘。


l1 = [1,2,3,4,5,6,7,8,9,10]

#reduce函數規定了,一定要傳遞一個支援一個二元操作的函數

#下面就是定義好的邏輯函數

def bin_func(x,y):

    return x * y


print reduce(plus,l1)

>>> 3628800

是reduce函數的工作原理:

650) this.width=650;" src="https://s5.51cto.com/wyfs02/M02/8E/D9/wKioL1jNAN2A82opAAC63NnUCNs013.png" title="reduce.png" alt="wKioL1jNAN2A82opAAC63NnUCNs013.png" />


接下來,解剖下reduce函數的實現代碼。

def reduce_func(func,seq,init_num=None):

    if init_num != None:

        ret = init_num

    else:

        ret = seq.pop(0)

    for i in seq:

        ret=func(ret,i)    #如果這條邏輯不好理解的話,可以仔細想想1*2*3*4 = ((1*2)*3)*4 

    return ret


print reduce_func(bin_func,l1)


>>>3628800


reduce函數使用lambda運算式。

print reduce_func(lambda x,y:x*y,l1)


注意!在python3當中,這個reduce函數被放到了functools這個模組中了,需要倒入functools才可以使用這個函數。


最後總結一下:

map函數用於處理序列中每一個元素。

filter函數用於過濾序列中每一個元素。

reduce函數用於做序列的合併作業。

reduce即為化簡,它是這樣一個過程:每次迭代,將上一次的迭代結果(第一次時為init的元素,如沒有init則為seq的第一個元素)與下一個元素一同執行一個二元的func函數。在reduce函數中,init是可選的,如果使用,則作為第一次迭代的第一個元素使用。



本文出自 “reBiRTH” 部落格,請務必保留此出處http://suhaozhi.blog.51cto.com/7272298/1907951

3.python中map,filter,reduce以及內部實現原理剖析

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.