Python的lambda, filter, reduce 和 map简介

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/reanote/p/python_lambda.html 

posted @ 2015-05-24 23:05  reanote  阅读(988)  评论(0编辑  收藏  举报