lambda 函式
在展开之前,我们先提一下 lambda 函式。可以利用 lambda 函式的语法,定义函式。 lambda 例子如下:

func = lambda x,y: x + y
print func(3,4)

lambda 生成一个函式物件。该函式引数为 x,y,返回值为 x+y 。函式物件赋给 func 。 func 的呼叫与正常函式无异。
 
以上定义可以写成以下形式:

def func(x, y):
return x + y

函式作为引数传递
函式可以作为一个物件,进行引数传递。函式名 (比如 func) 即该物件。比如说:

def test(f, a, b):
print ‘test’
print f(a, b)

test(func, 3, 5)

test 函式的第一个引数 f 就是一个函式物件。将 func 传递给 f,test 中的 f() 就拥有了 func() 的功能。
 
我们因此可以提高程式的灵活性。可以使用上面的 test 函式,带入不同的函式引数。比如:

test((lambda x,y: x**2 + y), 6, 9)

map() 函式
map() 是 Python 的内建函式。它的第一个引数是一个函式物件。

re = map((lambda x: x+3),[1,3,5,6])

这里,map() 有两个引数,一个是 lambda 所定义的函式物件,一个是包含有多个元素的表。 map() 的功能是将函式物件依次作用于表的每一个元素,每次作用的结果储存于返回的表 re 中。 map 通过读入的函式 (这里是 lambda 函式) 来运算元据(这里 “资料” 是表中的每一个元素,“操作” 是对每个资料加 3)。
在 Python 3.X 中,map() 的返回值是一个回圈物件。可以利用 list() 函式,将该回圈物件转换成表。
 
如果作为引数的函式物件有多个引数,可使用下面的方式,向 map() 传递函式引数的多个引数:

re = map((lambda x,y: x+y),[1,2,3],[6,7,9])

map() 将每次从两个表中分别取出一个元素,带入 lambda 所定义的函式。
filter() 函式
filter 函式的第一个引数也是一个函式物件。它也是将作为引数的函式物件作用于多个元素。如果函式物件返回的是 True,则该次的元素被储存于返回的表中。 filter 通过读入的函式来筛选资料。同样,在 Python 3.X 中,filter 返回的不是表,而是回圈物件。
 
filter 函式的使用如下例:

def func(a):
if a > 100:
return True
else:
return False

print filter(func,[10,56,101,500])

reduce() 函式
reduce 函式的第一个引数也是函式,但有一个要求,就是这个函式自身能接收两个引数。 reduce 可以累进地将函式作用于各个引数。如下例:

print reduce((lambda x,y: x+y),[1,2,5,7,9])

reduce 的第一个引数是 lambda 函式,它接收两个引数 x,y, 返回 x+y 。
reduce 将表中的前两个元素 (1 和 2) 传递给 lambda 函式,得到 3 。该返回值 (3) 将作为 lambda 函式的第一个引数,而表中的下一个元素 (5) 作为 lambda 函式的第二个引数,进行下一次的对 lambda 函式的呼叫,得到 8 。依次呼叫 lambda 函式,每次 lambda 函式的第一个引数是上一次运算结果,而第二个引数为表中的下一个元素,直到表中没有剩余元素。
上面例子,相当于 (((1+2)+5)+7)+9
 
根据 mmufhy 的提醒: reduce() 函式在 3.0 里面不能直接用的,它被定义在了 functools 包里面,需要引入包,见评论区。
总结
函式是一个物件
用 lambda 定义函式
map()
filter()
reduce()

作者:Vamei 出处:http://www.cnblogs.com/vamei