Python中的Lambda函数及其用法

Python中的Lambda函数及其用法

Lambda函数又称为匿名函数,匿名函数就是没有名字的函数。有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就可以将其定义为匿名函数。

匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果。

用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数。

先来看个简单的lambda函数:

1
2
>>> lambda x, y : x + y
<function <lambda> at 0x102bc1c80>

xy是函数的两个参数,冒号后面的表达式是函数的返回值,很明显这个匿名函数就是在求两个变量的和,但作为一个函数,没有名字如何使用呢?

这里我们暂且给这个匿名函数绑定一个名字,这样使得我们调用匿名函数成为可能。

1
2
3
4
5
>>> add = lambda x, y : x+y
>>> add
<function <lambda> at 0x102bc2140>
>>> add(1,2)
3

它等同于常规函数

1
2
3
4
5
6
7
>>> def add1(x, y):
... return x+y
...
>>> add1
<function add1 at 0x102bc1c80>
>>> add1(1,2)
3

lambda函数的使用场景(函数式编程)

sorted函数

例如:一个整数列表,要求按照列表中元素的绝对值大小升序排列。

1
2
3
>>> list1 = [3,5,-4,-1,0,-2,-6]
>>> sorted(list1, key=lambda x: abs(x))
[0, -1, -2, 3, -4, 5, -6]

排序函数sorted支持接收一个函数作为参数,该参数作为sorted的排序依据,这里按照列表元素的绝对值进行排序。

当然,也可以通过普通函数来实现:

1
2
3
4
5
>>> def foo(x):
... return abs(x)
...
>>> sorted(list1, key=foo)
[0, -1, -2, 3, -4, 5, -6]

只不过是使用这种方式,代码看起来不够Pythonic而已。

lambda:这是Python支持的一种有趣的语法,它允许你快速定义单行的最小函数,可以用在任何需要函数的地方:

1
2
3
4
5
>>> add = lambda x,y : x+y
>>> add(5,6)
11
>>> (lambda x,y:x+y)(5,6)
11

map,reduce,filter函数

1
2
3
4
5
6
7
8
9
10
11
12
# 求1~20的平方
>>> list(map(lambda x:x*x,range(1,21)))
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100, 121, 144, 169, 196, 225, 256, 289, 324, 361, 400]

# 求1~20之间的偶数
>>> list(filter(lambda x:x%2 == 0,range(1,21)))
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]

# 求1~100之和,再加上10000
>>> from functools import reduce
>>> reduce(lambda x,y:x+y,range(1,101),10000)
15050

闭包

闭包:一个定义在函数内部的函数,闭包使得变量即使脱离了该函数的作用域也依然能被访问到。

看一个用lambda函数作为闭包的例子:

1
2
3
4
5
6
>>> def add(n):
... return lambda x:x+n # 将匿名函数作为返回值返回
...
>>> add2 = add(5)
>>> add2(15)
20

这里的lambda函数就是一个闭包,在全局作用域范围中,add2(15)可以正常执行且返回值为20。之所以返回20是因为在add局部作用域中,变量n的值在闭包的作用下也可以被访问到。

参考资料

  1. 匿名函数 - 廖雪峰的官方网站
  2. 深入理解Lambda函数及其用法 - 碧水幽幽泉 - 博客园