1. 程式人生 > >函數語言程式設計-----序列處理函式:map(),filter(),reduce()

函數語言程式設計-----序列處理函式:map(),filter(),reduce()

map(function, sequence[, ...]) → list

建立一個新的列表,函式作用於原來列表中的每個元素

>>> map( int, [ "10", "12", "14", 3.1415926, 5L ] )
[10, 12, 14, 3, 5]

這個函式等效下面這個定義:

def map(function, sequence):
    return [function(v) for v in sequence]

map函式可以接收多個序列,如果是這種情況的話,function必須接收多個引數,引數的個數必須和序列的個數保持一致.如果function=None, 那麼返回的列表是有tuple構成的列表

>>>map(None, range(3), range(3))
[(0, 0), (1, 1), (2, 2)]

filter(function, sequence) → list

返回列表物件,它的sequence元素中作用在function函式中返回True的元素,如果function是None,那麼就是sequence中元素等於True的元素.它的行為定義類似於:

def filter( aFunction, aSequence ):
    return [ v for v in aSequence if aFunction(v) ]

例子:

>>>
import random >>> rolls = list( (random.randint(1,6),random.randint(1,6)) for u in range(100) ) >>> def hardways( pair ): ... d1, d2 = pair ... return d1 == d2 and d1+d2 in ( 4, 6, 8, 10 ) >>> filter( hardways, rolls ) [(4, 4), (5, 5), (2, 2), (5, 5), (4, 4), (5, 5),
(5, 5), (3, 3), (2, 2), (2, 2), (5, 5), (4, 4)] >>> len(_) 12

reduce(function, sequence[, initial=0]) → value

function必須接收兩個引數, function在內部累加sequence中的每個元素,到最後變成一個單一的value.

def reduce( aFunction, aSequence, init= 0 ):
    r= init
    for s in aSequence:
        r= aFunction( r, s )
    return r

例子:

>>> def plus( a, b ):
...     return a+b
>>> reduce( plus, [1, 3, 5, 7, 9] )
25

python的built-in函式中如:sum(),any(),all()都是類似的reduce函式.

zip(sequence[, sequence...]) → sequence

zip接收的引數都是序列,他把多個序列便成一個序列,新序列是tuple的集合.如果其中一個序列太長那就就會被擷取.
例子:

>>> zip( range(5), range(1,12,2) )
[(0, 1), (1, 3), (2, 5), (3, 7), (4, 9)]

這個例子中,前面序列range(5)的長度是5, 後面序列的長度是6,最終長的序列會被擷取掉. 當map的地一個引數function是None時,其功能與zip類似,但是map不是擷取,而是對較短的序列用None填充.

>>> map(None, range(5), range(1,12,2))
[(0, 1), (1, 3), (2, 5), (3, 7), (4, 9), (None, 11)]

http://www.itmaybeahack.com/book/python-2.6/html/p02/p02c10_adv_seq.html


關注公眾號「Python之禪」(id:vttalk)獲取最新文章 python之禪