教為學:Python學習之路(五):map reduce學習前言
昨天的部落格竟然被首頁下架了,雖然水了點,總覺得可以查看協助解決的內容,不值得花太多的功夫。
說到map reduce,第一反應是Hadoop的map reduce函數編程。
不過我們這裡要講的python,有時間可以寫寫Hadoop的map reduce。
Lamdba函數
要瞭解map reduce,首先得瞭解Lamdba函數,Lamdba函數顧名思義就是匿名函數。園子裡很多時候關於c#和java之爭的時候,匿名函數都會作為c#的一個優點陳列在前,某種意義上,這是對匿名函數能力的認可。Java在最新版本中也計劃把匿名函數給加進來,同樣也是對匿名函數的認可。
所謂匿名函數就是沒有名字的函數,沒有名字的函數怎麼調用。
正常的函數及其調用:
- def f(x):
- return 2*x
- print f(3)
- #結果
- 6
F是函數名。
F(3)是調用函數。
不正常函數(匿名函數)及其調用:
- g = lambda x:x*2
- print g(3)
- #結果
- 6
G算什嗎?
好像還是函數名。
那我們來個更徹底的。
- print (lambda x:x*2)(3)
- #結果
- 6
連f和g都徹底沒了。
這東西有什麼用?
Map函數
所有的函數,我先上的是這麼句話。
- help(map)
- #結果
- map(...)
- map(function, sequence[, sequence, ...]) -> list
-
- Return a list of the results of applying the function to the items of
- the argument sequence(s). If more than one sequence is given, the
- function is called with an argument list consisting of the corresponding
- item of each sequence, substituting None for missing values when not all
- sequences have the same length. If the function is None, return a list of
- the items of the sequence (or a list of tuples if more than one sequence).
看了這個協助,大家就應該清楚,匿名函數這個東西用在哪裡吧!
上個例子再解釋這個函數:
- print map(lambda x:x*2,[1,2,3,4])
- #結果
- [2, 4, 6, 8]
函數參數是一個函數,然後把後面的序列裡面的值一個個傳入這個函數,最後返回一個列表。
Reduce函數
國際慣例:
- help(reduce)
- #結果
- reduce(...)
- reduce(function, sequence[, initial]) -> value
-
- Apply a function of two arguments cumulatively to the items of a sequence,
- from left to right, so as to reduce the sequence to a single value.
- For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
- ((((1+2)+3)+4)+5). If initial is present, it is placed before the items
- of the sequence in the calculation, and serves as a default when the
- sequence is empty.
這次的協助還有個小例子,那麼,我們就運行一下這個小例子吧。
- print reduce(lambda x,y:x+y,[1,2,3,4,5])
- #結果
- 15
第一個參數函數必須有兩個參數,不然,這東西玩不下去了。
把序列中的第一個和第二個元素作為參數傳遞給函數,然後把傳回值和第三個元素傳遞給函數,然後把傳回值和第四個元素傳遞給參數,以此類推,其實上面的結果是((((1+2)+3)+4)+5)
Filter函數
繼續國際慣例:
- help(filter)
- #結果
- filter(...)
- filter(function or None, sequence) -> list, tuple, or string
-
- Return those items of sequence for which function(item) is true. If
- function is None, return the items that are true. If sequence is a tuple
- or string, return the same type, else return a list.
再上例子:
- print filter(lambda x:x%2==1,[1,2,3,4])
- 結果
- [1, 3]
人如其名,過濾器,把滿足要求的序列過濾出來。
第一個參數還是個函數,不過相比其他幾個,這次可以為none。
函數只能返回布爾值,作為判斷條件。
也就是說,序列裡面滿足函數判斷條件的值全部返回出來。