教為學:Python學習之路(五):map reduce學習

來源:互聯網
上載者:User
教為學:Python學習之路(五):map reduce學習前言

昨天的部落格竟然被首頁下架了,雖然水了點,總覺得可以查看協助解決的內容,不值得花太多的功夫。

說到map reduce,第一反應是Hadoop的map reduce函數編程。

不過我們這裡要講的python,有時間可以寫寫Hadoop的map reduce。

Lamdba函數

要瞭解map reduce,首先得瞭解Lamdba函數,Lamdba函數顧名思義就是匿名函數。園子裡很多時候關於c#和java之爭的時候,匿名函數都會作為c#的一個優點陳列在前,某種意義上,這是對匿名函數能力的認可。Java在最新版本中也計劃把匿名函數給加進來,同樣也是對匿名函數的認可。

所謂匿名函數就是沒有名字的函數,沒有名字的函數怎麼調用。

正常的函數及其調用:

  1. def f(x):
  2.     return 2*x
  3. print f(3)
  4. #結果
  5. 6

F是函數名。

F(3)是調用函數。

不正常函數(匿名函數)及其調用:

  1. g = lambda x:x*2
  2. print g(3)
  3. #結果
  4. 6

G算什嗎?

好像還是函數名。

那我們來個更徹底的。

  1. print (lambda x:x*2)(3)
  2. #結果
  3. 6

連f和g都徹底沒了。

這東西有什麼用?

Map函數

所有的函數,我先上的是這麼句話。

  1. help(map)
  2. #結果
  3. map(...)
  4.     map(function, sequence[, sequence, ...]) -> list
  5.  
  6.     Return a list of the results of applying the function to the items of
  7.     the argument sequence(s). If more than one sequence is given, the
  8.     function is called with an argument list consisting of the corresponding
  9.     item of each sequence, substituting None for missing values when not all
  10.     sequences have the same length. If the function is None, return a list of
  11.     the items of the sequence (or a list of tuples if more than one sequence).

看了這個協助,大家就應該清楚,匿名函數這個東西用在哪裡吧!

上個例子再解釋這個函數:

  1. print map(lambda x:x*2,[1,2,3,4])
  2. #結果
  3. [2, 4, 6, 8]

函數參數是一個函數,然後把後面的序列裡面的值一個個傳入這個函數,最後返回一個列表。

Reduce函數

國際慣例:

  1. help(reduce)
  2. #結果
  3. reduce(...)
  4.     reduce(function, sequence[, initial]) -> value
  5.  
  6.     Apply a function of two arguments cumulatively to the items of a sequence,
  7.     from left to right, so as to reduce the sequence to a single value.
  8.     For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates
  9.     ((((1+2)+3)+4)+5). If initial is present, it is placed before the items
  10.     of the sequence in the calculation, and serves as a default when the
  11.     sequence is empty.

這次的協助還有個小例子,那麼,我們就運行一下這個小例子吧。

  1. print reduce(lambda x,y:x+y,[1,2,3,4,5])
  2. #結果
  3. 15

第一個參數函數必須有兩個參數,不然,這東西玩不下去了。

把序列中的第一個和第二個元素作為參數傳遞給函數,然後把傳回值和第三個元素傳遞給函數,然後把傳回值和第四個元素傳遞給參數,以此類推,其實上面的結果是((((1+2)+3)+4)+5)

Filter函數

繼續國際慣例:

  1. help(filter)
  2. #結果
  3. filter(...)
  4.     filter(function or None, sequence) -> list, tuple, or string
  5.  
  6.     Return those items of sequence for which function(item) is true. If
  7.     function is None, return the items that are true. If sequence is a tuple
  8.     or string, return the same type, else return a list.

再上例子:

  1. print filter(lambda x:x%2==1,[1,2,3,4])
  2. 結果
  3. [1, 3]

人如其名,過濾器,把滿足要求的序列過濾出來。

第一個參數還是個函數,不過相比其他幾個,這次可以為none。

函數只能返回布爾值,作為判斷條件。

也就是說,序列裡面滿足函數判斷條件的值全部返回出來。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.