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

Posted 不剪发的Tony老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 表达式将匿名函数传递给其他函数,或者从一个函数中返回其他函数。

以上是关于Python入门教程第26篇 Lambda表达式的主要内容,如果未能解决你的问题,请参考以下文章

《MongoDB入门教程》第26篇 聚合统计之$max/$min表达式

一课掌握Lambda表达式语法及作用简单入门1??

python 匿名函数 lambda

Java-Lambda表达式第一篇认识Lambda表达式

12_Python的(匿名函数)Lambda表达式_Python编程之路

python基础入门之十二 —— lambda表达式