@tingyuge
2016-08-05T13:33:38.000000Z
字数 1124
阅读 1275
Python
lambda
算是一个表达式,虽然它定义的是一个匿名函数
,但其本身依然算是一个表达式。
匿名函数
主要用在需要一个函数,但又不想费神的去定义命名一个函数
的场景下,在实际应用中往往带来的是代码逻辑的清晰与简洁。
比如:在某种需求下,需要对一个list中的每个元素进行平方运算:
当然可以使用列表表达式:
data = [1, 2, 3]
[x*x for x in data]
不过这里不讨论列表表达式,如果用定义函数的方法呢就是:
def sqrt(x):
return x * x
list(map(sqrt, [x for x in data]))
这里是在一定范围内作用域内定义了一个函数,可能函数就只使用这一次,但依然需要定义一个全局函数,可能会导致环境污染。
而如果使用匿名函数:
list(map(lambda x: x*x, [x for x in data]))
不需要为只使用一次的函数定义,只需要专注于逻辑实现,代码层面也比较清晰,不会再函数之间跳来跳去。
匿名函数
毕竟也是一个函数,所抽象出来的东西也是一组运算。和函数的用法有些区别但不大。
比如,在python中可以这样:
def sqrt(x):
return x*x
foo = sqrt
foo(3) #返回9
上述代码就是先声明一个函数sqrt()
,之后将sqrt
这个变量所指向的函数赋值给foo
变量,之后就可以通过foo(3)
调用函数。
在Python中,函数名也是变量,其指向的是定义函数时的函数主体,也就是
sqrt
是一个变量,他代表的是sqrt()
这个函数主体,赋值给foo
,就是将函数主体赋值给foo
变量,之后foo
与sqrt
的作用是一样的。也可以理解为:
foo(3)
是函数调用,foo
是函数主体
同样的使用lambda
定义匿名函数
时也可以这样:
foo = lambda x: x*x
foo(3) # 返回9
也就可以看出lambda x: x*x
实际上就是:
def sqrt(x):
return x*x
lambda
表达式中,冒号前面的x
就是函数的参数,返回值就是表达式的结果。
在python中,匿名函数有个限制就是只能有一个表达式,可能是为了避免过分的滥用导致代码晦涩难懂。
同样也可以将匿名函数作为函数返回值返回,比如:
def action(x):
return lambda y: x+y
a = action(2)
a(20) # 返回22
在这里a = action(2)
的作用是将2赋值给参数x,之后的a
就是一个函数,其函数体为:
lambda y: 2+y
所以a(20)
的结果为22。
也可以把def
直接写成lambda
形式:
b = lambda x: lambda y: x+y
a = b(3)
a(2) # 返回5
(b(2))(2) # 返回4
官方文档的介绍: