[关闭]
@tingyuge 2016-08-05T13:33:38.000000Z 字数 1124 阅读 1275

Lambda表达式

Python


lambda算是一个表达式,虽然它定义的是一个匿名函数,但其本身依然算是一个表达式。

匿名函数主要用在需要一个函数,但又不想费神的去定义命名一个函数的场景下,在实际应用中往往带来的是代码逻辑的清晰与简洁。

比如:在某种需求下,需要对一个list中的每个元素进行平方运算:

当然可以使用列表表达式:

  1. data = [1, 2, 3]
  2. [x*x for x in data]

不过这里不讨论列表表达式,如果用定义函数的方法呢就是:

  1. def sqrt(x):
  2. return x * x
  3. list(map(sqrt, [x for x in data]))

这里是在一定范围内作用域内定义了一个函数,可能函数就只使用这一次,但依然需要定义一个全局函数,可能会导致环境污染。

而如果使用匿名函数:

  1. list(map(lambda x: x*x, [x for x in data]))

不需要为只使用一次的函数定义,只需要专注于逻辑实现,代码层面也比较清晰,不会再函数之间跳来跳去。

匿名函数毕竟也是一个函数,所抽象出来的东西也是一组运算。和函数的用法有些区别但不大。
比如,在python中可以这样:

  1. def sqrt(x):
  2. return x*x
  3. foo = sqrt
  4. foo(3) #返回9

上述代码就是先声明一个函数sqrt(),之后将sqrt这个变量所指向的函数赋值给foo变量,之后就可以通过foo(3)调用函数。

在Python中,函数名也是变量,其指向的是定义函数时的函数主体,也就是sqrt是一个变量,他代表的是sqrt()这个函数主体,赋值给foo,就是将函数主体赋值给foo变量,之后foosqrt的作用是一样的。

也可以理解为:
foo(3)是函数调用,foo是函数主体

同样的使用lambda定义匿名函数时也可以这样:

  1. foo = lambda x: x*x
  2. foo(3) # 返回9

也就可以看出lambda x: x*x实际上就是:

  1. def sqrt(x):
  2. return x*x

lambda表达式中,冒号前面的x就是函数的参数,返回值就是表达式的结果。

在python中,匿名函数有个限制就是只能有一个表达式,可能是为了避免过分的滥用导致代码晦涩难懂。

同样也可以将匿名函数作为函数返回值返回,比如:

  1. def action(x):
  2. return lambda y: x+y
  3. a = action(2)
  4. a(20) # 返回22

在这里a = action(2)的作用是将2赋值给参数x,之后的a就是一个函数,其函数体为:

  1. lambda y: 2+y

所以a(20)的结果为22。
也可以把def直接写成lambda形式:

  1. b = lambda x: lambda y: x+y
  2. a = b(3)
  3. a(2) # 返回5
  4. (b(2))(2) # 返回4

官方文档的介绍:

lambda表达式

函数与lambda表达式

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注