MEMOO
MEMOO
Published on 2025-04-18 / 7 Visits
0
0

Python中的Lambda表达式

摘要:在本节中,你将了解 Python 的Lambda 表达式,以及如何使用它们来编写匿名函数。

有时候,你需要编写一个只有一个表达式的简单函数。然而,你只需要使用这个函数一次。因此,为了这个目的专门定义该函数就没有必要了。

这就是 PythonLambda 表达式发挥作用的地方。

什么是 Python 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() 函数接受三个参数:

  1. 名字first_name

  2. 姓氏last_name

  3. 一个用于格式化全名的函数formatter)。反过来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

以下是完整代码:

def get_full_name(first_name, last_name, formatter):

    return formatter(first_name, last_name)

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}"

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

你可以使用 lambda 表达式,而不是定义 first_lastlast_first 这两个函数。

例如,你可以使用下面的 lambda 表达式来表示 first_last 函数:

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

这个 lambda 表达式接受两个参数,并按照名字、空格、姓氏的顺序将它们连接成一个格式化的字符串。

并且下面使用一个 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() 函数:

def times(n):

    return lambda x: x * n

double = times(2)

由于 times() 函数返回一个函数,所以 double 也是一个函数。要调用它,你需要像这样加上括号:

def times(n):

    return lambda x: x * n

double = times(2)

result = double(2)

print(result)

result = double(3)

print(result)

输出:

4

6

下面展示了使用 times() 函数的另一个示例:

def times(n):

    return lambda x: x * n

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 绑定到每个 lambda 表达式上。一种方法是使用默认参数:

callables = []

for i in (1, 2, 3):

    callables.append(lambda a=i: a)

for f in callables:

    print(f())

输出:

1

2

3

在这个例子中,变量 a 的值是在创建 lambda 表达式时进行求值的。因此,该程序返回了预期的输出。

总结

  • 使用 Python 的 lambda 表达式来创建匿名函数,即没有名字的函数。

  • 一个 lambda 表达式接受一个或多个参数,包含一个表达式,并返回该表达式的结果。

  • 使用 lambda 表达式将匿名函数传递给另一个函数,以及从一个函数中返回一个函数。


Comment