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表达式