写点什么

简单了解 Python 匿名函数:lambda

作者:踏雪痕
  • 2022 年 3 月 13 日
  • 本文字数:1746 字

    阅读完需:约 6 分钟

简单了解 Python 匿名函数:lambda

前言

在 Python 中,说到函数,大家都很容易想到用 ​​def​​ 关键字来声明一个函数,如下:

def Hello():    # function body
复制代码

然后我们可以在添加由圆括号括起来的参数列表。函数体内可能有很多行代码,里面有尽可能多的语句和表达式。

除了 ​​def​​​ 语句定义函数以外,还有一种生成函数对象的表达式形式: ​​lambda​​ 表达式,这个表达式创建了一个能够随时调用的函数。

有时声明一个函数只有一条语句,比如:

def square(x):    return x*2
复制代码

​lambda​​​  函数返回函数本身而不是将其赋值给一个变量名。所以它也被称为匿名函数(没有函数名)。 ​​lambda​​​  的一般形式是关键字 ​​lambda​​ 后面跟上一个或者多个参数,之后是一个冒号,再之后是一个表达式:

lambda argument1, argument2, ... argumentN: expression using argument
复制代码

lambda 表达式所返回的函数对象与 def 创建并赋值后的函数对象工作起来是完全一样。一个 lambda 函数可以有尽可能多的参数,但函数体必须是一个表达式。


如何使用 lambda

​lambda​​  只能包含一个表达式,通常用作内联函数的定义,或者用作推迟一些代码的执行。

再来看上面的平方的例子:

def square(x):    return x*x
a_list = [1, 2, 3, 4, 5]aa_list = list(map(square, a_list))print(aa_list) # [1, 4, 9, 16, 25]
复制代码

上述代码就是 lambda 函数使用的好地方,使用更少的代码行,并且可以避免创建仅使用一次的命名函数(然后必须存储在内存中)。​您可以编写一个将其参数平方的 lambda 函数: ​​lambda x: x*2​​ ,并将其与 map 函数一起使用以将列表中的所有元素进行平方运算:

a_list = [1, 2, 3, 4, 5, 6]aa_list = list(map(lambda x: x*2, a_list))print(aa_list) # [2, 4, 6, 8, 10, 12]
复制代码

如果在短时间需要一个小函数,可以使用 lambda 函数——例如作为 map 或 filter 等高阶函数的参数,可以我们利用 lambda 来筛选偶数:

a_list = [1, 2, 3, 4, 5, 6]aa_list = list(filter(lambda x: x%2==0, a_list))print(aa_list) # [2, 4, 6]
复制代码

lambda 函数是在使用它的地方定义的,这样内存中就没有命名函数。如果只在一个地方使用了一个函数,那么使用 lambda 函数来避免混乱是有意义的。

lambda 也能嵌套

还可以从函数返回 lambda 函数。如果您需要创建多个乘以数字的函数,例如加倍或三倍等,lambda 可以提供帮助。您可以创建一个函数 multiplyBy ,而不是创建多个函数,如下所示,然后使用不同的参数多次调用此函数以创建双倍、三倍等函数:

def muliplyBy (n):  return lambda x: x*n  double = multiplyBy(2)triple = muliplyBy(3)times10 = multiplyBy(10)
复制代码

​lambda 函数从父函数获取值 n,因此在 double 中 n 的值为 2,在三倍中为 3,在 times10 中为 10。现在使用参数调用这些函数将乘以该数字。​

double(6)> 12triple(5)> 15times10(12)> 120
复制代码

如果您在这里没有使用 lambda 函数,则需要在 ​​multiplyBy​​  中定义一个不同的函数,如下所示:

def muliplyBy (x):  def temp (n):    return x*n  return temp
复制代码

使用 lambda 函数使用一半的行并使其更具可读性。通常,lambda 起到了一种函数速写的作用,可以在使用它的代码中嵌入一个函数的定义。


利用 lambda 表达式来替换三元表达式

还记得 python 的三元表达式吗?

可以把如下语句:

if a :  belse:  c
复制代码

可以把上述表达式用三元表达式来替换:

b if a else c
复制代码

用 lambda 表达式来替换实现相同的逻辑:

>>> lower = (lambda x, y: x if x < y else y)>>> lower(1, 2)1
复制代码

总结

  • lambda 是一个表达式,而不是语句。因此,lambda 能够出现在 Python 语法不允许 def 出现的地方。例如在一个列表字面量中或者函数调用的参数中,而使用 def 语句虽然函数能通过名称引用,但是必须在其他地方创建,作为一个表达式,lambda 返回一个值(一个新的函数),可以选择性地被赋值给一个变量值。

  • lambda 的主体是一个单独的表达式,而不是一个代码块。 lambda 的主体可以像 def 函数体的 return 语句一样,可以将结果写出一个裸露的表达式,而不是显式地返回。

  • lambda 是一个编写简单的函数而设计的,而 def 用来处理更大的任务。

本篇文章只是简单的了解一下 lambda 匿名函数,下一篇文章将会介绍 lambda 函数与 map、filter、reduce 结合的妙用。

发布于: 刚刚阅读数: 3
用户头像

踏雪痕

关注

还未添加个人签名 2020.03.30 加入

还未添加个人简介

评论

发布
暂无评论
简单了解 Python 匿名函数:lambda_Python_踏雪痕_InfoQ写作平台