摘要:在本节中,你将了解 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()
函数接受三个参数:
名字
first_name
)姓氏
last_name
)一个用于格式化全名的函数
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_last
和 last_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 表达式将匿名函数传递给另一个函数,以及从一个函数中返回一个函数。