lambda 通常称为匿名函数,常用于定义一些很简单的函数。
注意: lambda是一个表达式,lambda会创建一个函数对象,但不会把这个函数对象赋给一个标识符;而def是语句,def会把一个函数对象赋值给一个变量。
表达式 Expressions:
有值,所以可以写在赋值语句的右侧,而import,for等语句不能被用于赋值。
语句 Statement:
不一定有值。语句有简单语句和复合语句之分:简单语句是指一逻辑行的代码,例如表达式语句、赋值语句和return语句等。复合语句是指包含、影响或控制一组语句的代码。例如if、try和class语句等。
因为lambda是表达式,所以可以直接作为list或dict的成员 [lambda x: x*x, lambda x: x+x]
但是def等语句无法直接放入其中。
lambda用法:
pord = lambda x: x*x
print pord(2)
# 4
prod2 = lambda x,y: x*y
print prod2(2,3)
# 6
lambda :
后面只能有一个语句,就如def 的 return 一样用于返回值,所以无法在后面使用多余的语句如if等,并且这样返回也是错的:
prod = lambda x,y: x,y
# NameError: name 'y' is not defined
来看看 def 定义的函数会返回什么?
>>> def y():
... x = 2
... y = 4
... return x,y
...
>>> y()
(2, 4)
>>> type(y())
<type 'tuple'>
返回了一个元组,return并不能返回多个值,故而a, b 被语法糖元组给包裹了,但是很显然lambda并不支持这么做。
lambda起到简化语句,并且不需要担心命名冲突。lambda 也可直接作为函数的返回语句,起到一个闭包Closure的作用:
>>> def a(x, y):
... return lambda : x*x + y*y
...
>>> a(2,3)
<function <lambda> at 0x7f2133346320>
>>> a(2,3)()
13
你甚至可以配合reduce高阶函数利用一条代码就实现一个阶乘:
>>> factorial = lambda x: reduce(int.__mul__, xrange(2,x+1))
>>> factorial(10)
3628800