zzxworld

Python lambda 匿名函数表达式的概念和用途

Python lambda 匿名函数表达式的概念和用途

前几天在《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))