Python的lambda, filter, reduce 和 map簡介

來源:互聯網
上載者:User

標籤:

Lambda 操作

Lambda操作——有些人喜歡,有些人討厭,還有很多人害怕。當你看完了我們這章的介紹後,我們很自信你會喜歡上它。要不然,你可以去學習Guido van Rossums更喜歡去用的“list comprehensions”(遞推式構造列表)了,因為他也不喜歡Lambda, map filter 和reduce。

 

Lambda操作或者lambda函數是一種建立小型匿名函數的方式,即:函數都沒有函數名。這些函數都是投擲(throw-away)函數,即:它們只會在我們需要的地方建立,Lambda函數大部分時間都是與filter(), map() 和 reduce()函數混合使用。Lambda特性被添加到Python是因為Lisp 程式員的強烈要求。

Lambda函數通常的文法是十分簡單的:

lambda argument_list: expression

參數列表(argument_list)是由逗號分隔的參數列表組成,而上面這個運算式(expression)是一個可以使用這些參數的算術運算式。你能通過把這個函數賦給一個變數來給這個lambda函數一個名字。

下面這個lambda函數的例子返回的是這兩個參數的和:

>>> f = lambda x, y : x + y>>> f(1,1)2

 

map() 函數

當與map函數混合使用的時候,lambda操作的優勢就能體現出來了。

map()是一個帶有兩個參數的函數:

r = map(func, seq)

第一個參數func是一個函數名,第二個seq是一個序列(如:list)。map()將會這個函數應用在序列seq的每一個元素上,然後返回一個被這個函數func改變後的元素的列表

def fahrenheit(T):    return ((float(9)/5)*T + 32)def celsius(T):    return (float(5)/9)*(T-32)temp = (36.5, 37, 37.5,39)F = map(fahrenheit, temp)C = map(celsius, F)

 在上面這個例子中,我們沒有使用lambda,如果使用lambda,我們不需要去定義和命名fahrenheit()和celsius()函數。你能夠從下面的互動過程中看到:

>>> Celsius = [39.2, 36.5, 37.3, 37.8]>>> Fahrenheit = map(lambda x: (float(9)/5)*x + 32, Celsius)>>> print Fahrenheit[102.56, 97.700000000000003, 99.140000000000001, 100.03999999999999]>>> C = map(lambda x: (float(5)/9)*(x-32), Fahrenheit)>>> print C[39.200000000000003, 36.5, 37.300000000000004, 37.799999999999997]>>>

 map()能夠應用多個列表,但這些列表必須有相同的長度。map()將會應用它的lambda函數在這些列表的元素上,如:首先應用在下標為0的元素上,然後應用在下標為1的元素上,直到到達下標為n:

>>> a = [1,2,3,4]>>> b = [17,12,11,10]>>> c = [-1,-4,5,9]>>> map(lambda x,y:x+y, a,b)[18, 14, 14, 14]>>> map(lambda x,y,z:x+y+z, a,b,c)[17, 10, 19, 23]>>> map(lambda x,y,z:x+y-z, a,b,c)[19, 18, 9, 5]

 我們可以從上面的例子中看到,參數x的值是來自a列表的,而y的值來自列表b,z的值來自列表c。

 

Filtering 

filter(func, list)函數提供了一種優雅的方式去把函數func傳回值為True的元素過濾出來。

filter(f, l) 需要一個函數f作為它的第一個參數。f返回一個布爾型的值,如:True或者False。這個函數將會應用在列表l的每一個元素上。只有當f返回True的時候,這個列表中的元素才會包含在結果清單中。

>>> fib = [0,1,1,2,3,5,8,13,21,34,55]>>> result = filter(lambda x: x % 2, fib)>>> print result[1, 1, 3, 5, 13, 21, 55]>>> result = filter(lambda x: x % 2 == 0, fib)>>> print result[0, 2, 8, 34]>>> 

 

Reducing a List

函數reduce(func, seq)持續的應用函數func在序列上。它將會返回一個值。

一個序列 seq = [ s1, s2, s3, ... , sn ], 調用reduce(func, seq)的工作像這樣:

  • 首先,序列的第一、第二個元素將會應用到函數func中,如:func(s1,s2),這之後這個列表看起來像這樣: [ func(s1, s2), s3, ... , sn ]
  • 下一步,函數func將會應用在前一個結果和序列的第三個元素上,如:func(func(s1, s2),s3),這個列表現在看起來像: [ func(func(s1, s2),s3), ... , sn ]
  • 這樣持續下去,直到只剩下一個元素,然後作為reduce的結果返回這個元素

我們通過下面的例子來闡明這個過程:

>>> reduce(lambda x,y: x+y, [47,11,42,13])113

下面這個圖展示了中間的計算步驟:

 

reduce()舉例

使用reduce來尋找一列數字中的最大值

>>> f = lambda a,b: a if (a > b) else b>>> reduce(f, [47,11,42,102,13])102>>> 

計算數字1到100的和:

>>> reduce(lambda x, y: x+y, range(1,101))5050

 

原文(英文):http://www.python-course.eu/lambda.php

翻譯(中文):http://www.cnblogs.com/rhjiang/

轉載請註明出處。 

 

Python的lambda, filter, reduce 和 map簡介

相關文章

聯繫我們

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