【Python入门教程】第26篇 Lambda表达式

本篇我们介绍 Python lambda 表达式,以及如何使用它来编写匿名函数。

lambda 表达式概述

有时候,我们想要编写由单个表达式组成的简单函数,而且我们只需要使用该函数一次。这种情况下没有必要使用 def 关键字定义一个函数,可以利用 lambda 表达式简化整个过程。

Python lambda 表达式可以用于创建一个匿名函数,匿名函数就是没有名字的函数。当我们只需要调用一次函数时,匿名函数非常有用。

lambda 表达式通常包含一个或多个函数,但是它只能包含一个表达式。以下是 lambda 表达式的语法:

lambda parameters: expression

它等价于以下函数(没有名字“anonymous”):

def anonymous(parameters):
    return expression

lambda 表达式示例

在 Python 中,我们可以将一个函数作为参数传递给另一个函数,或者从一个函数中返回另一个函数。

示例一:使用函数作为参数

以下示例定义了一个 get_full_name() 函数,她可以基于姓氏和名字创建格式化的姓名:

def get_full_name(first_name, last_name, formatter):
    return formatter(first_name, last_name)

函数 get_full_name() 包含三个参数:

  • 名字(first_name)
  • 姓氏(last_name)
  • 用于格式化姓名的函数(formatter)。格式化参数又包含名字和姓氏两个参数。

以下示例定义了两个基于名字和姓氏返回不同格式的姓名的函数:

def first_last(first_name, last_name):
    return f"{first_name} {last_name}"


def last_first(first_name, last_name):
    return f"{last_name}, {first_name}"

接下来的代码使用名字、姓氏以及 first_last / last_first 函数调用 get_full_name() 函数:

full_name = get_full_name('John', 'Doe', first_last)
print(full_name) # John Doe

full_name = get_full_name('John', 'Doe', last_first)
print(full_name) #  Doe, John

输出的结果如下:

John Doe
Doe, John

除了定义 first_last 和 last_first 函数之外,我们也可以使用 lambda 表达式实现相同的结果。例如,我们可以使用以下 lambda 表达式替代 first_last 函数:

lambda first_name,last_name: f"{first_name} {last_name}"

以上 lambda 表达式接受两个参数并且将它们按照 first_name 加上空格以及 last_name 的格式进行连接。

同理,以下 lambda 表达式可以替代 last_first 函数:

lambda first_name, last_name: f"{last_name} {first_name}";

通过使用 lambda 表达式,我们可以这样调用 get_full_name() 函数:

def get_full_name(first_name, last_name, formatter):
    return formatter(first_name, last_name)


full_name = get_full_name(
    'John',
    'Doe',
    lambda first_name, last_name: f"{first_name} {last_name}"
)
print(full_name)

full_name = get_full_name(
    'John',
    'Doe',
    lambda first_name, last_name: f"{last_name} {first_name}"
)
print(full_name)

输出结果如下:

John Doe
Doe, John

示例二:返回函数的函数

下面的 times() 函数返回了一个函数,也就是一个 lambda 表达式:

def times(n):
    return lambda x: x * n

以下示例调用了 times() 函数:

double = times(2)

因为 times() 函数的返回值是一个函数,因此 double 也是一个函数。接下来我们调用该函数:

result = double(2)
print(result)

result = double(3)
print(result)

输出结果如下:

4
6

以下是另一个使用 times() 函数的示例:

triple = times(3)

print(triple(2))  # 6
print(triple(3))  # 9

循环语句中的 lambda 表达式

我们来看以下示例:

callables = []
for i in (1, 2, 3):
    callables.append(lambda: i)

for f in callables:
    print(f())

以上代码的执行过程如下:

  • 首先,定义一个名为 callables 的列表。
  • 然后,遍历 1 到 3,每次创建一个新的 lambda 表达式并将其添加到列表 callables。
  • 最后,遍历列表 callables 调用每个函数。

我们期望的输出结果如下:

1
2
3

不过,实际的输出结果如下:

3
3
3

问题在于三个 lambda 表达式都引用了变量 i,而不是 i 的当前值。当我们调用 lambda 表达式时,变量 i 的值为 3。

为了解决这个问题,我们需要在创建 lambda 表达式时将变量 i 的值进行绑定。方法之一就是使用默认参数:

callables = []
for i in (1, 2, 3):
    callables.append(lambda a=i: a)

for f in callables:
    print(f())

在上面的示例中,变量 a 在 lambda 表达式创建时赋值。因此,程序返回了期望的结果。

总结

  • lambda 表达式可以创建匿名函数。
  • lambda 表达式接受一个或多个参数,包含一个表达式并返回该表达式的值。
  • 使用 lambda 表达式将匿名函数传递给其他函数,或者从一个函数中返回其他函数。
  • 1
    点赞
  • 1
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:酷酷鲨 设计师:CSDN官方博客 返回首页
评论

打赏作者

不剪发的Tony老师

为 5 个 C 币而折腰。

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值