函數語言程式設計-----序列處理函式:map(),filter(),reduce()
阿新 • • 發佈:2018-12-11
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)獲取最新文章