前几天在《Python 函数学习总结》这篇文章最后简单的提到了 Python 的匿名函数 lambda,感觉意犹未尽。于是又花了点时间了解了一下 lambda,尝试详细的来看看它的概念和用途。
首先来看一个非常简单的 Python 函数:
def increment(n):
return n + 1
这个函数可以传入一个数值,并返回加 1 后的值。用 lambda 来写是这样的:
increment = lambda n : n + 1
忽略 increment =
这部分变量赋值的语句,可以看出 lambda 的格式定义非常简单:
lambda 参数 : 语句
而对照以上 increment
两种函数方式的定义代码,也可以看出 lambda 和普通函数的区别。
- 普通函数是以
def
关键字开始,lambda 是以lambda
关键字开始。 - 普通函数的函数名是必须的,lambda 则不需要。
- 普通函数使用
return
关键字处理返回值,lambda 不需要。 - 普通函数可以使用换行和缩进处理代码逻辑,lambda 局限于一行。
综上区别不难发现,lambda 是一种不需要考虑名称定义,随写随用的简单逻辑处理方式。不过这个简单并不意味着 lambda 只能处理上面这种直接运算的「一元逻辑」。lambda 配合流程控制语句,也能玩出一些比较实用的花样。比如下面这个:
lambda n : '奇数' if n % 2 else '偶数'
通过加入一条简单的 if
流程控制语句,就实现了奇偶数的判断功能。如果使用多条 if
语句,可以实现更复杂的逻辑处理:
lambda n : '个位数' if n < 10 else ('十位数' if n < 100 else '百位数以上')
不过以 lambda 语句只能写在一行的定义,加入的逻辑条件越多,只会增加后期维护代码时的理解难度。所以不太建议在 lambda 中使用过多的判断逻辑。
除了使用 if
语句,在 lambda 中也可以应用 for
循环语句:
lambda s : ''.join([w for w in s if not w.isdigit()])
上面这个匿名函数通过 for
循环遍历,加上 if
条件判断,组合实现了去除字符串中数字的功能。
lambda 作为不需要定义函数名的特性,最大的用途是针对一些提供了「回调功能」的函数场景。比如配合 filter
函数做列表过滤:
filter(lambda n : n % 2==0, range(1, 10))
或是配合 map
函数调整每个列表值的内容:
map(lambda n : n + 10, range(1, 10))