本篇我们介绍 Python lambda 表达式,以及如何使用它来编写匿名函数。
有时候,我们想要编写由单个表达式组成的简单函数,而且我们只需要使用该函数一次。这种情况下没有必要使用 def 关键字定义一个函数,可以利用 lambda 表达式简化整个过程。
Python lambda 表达式可以用于创建一个匿名函数,匿名函数就是没有名字的函数。当我们只需要调用一次函数时,匿名函数非常有用。
lambda 表达式通常包含一个或多个函数,但是它只能包含一个表达式。以下是 lambda 表达式的语法:
lambda parameters: expression
它等价于以下函数(没有名字“anonymous”):
def anonymous(parameters): return expression
在 Python 中,我们可以将一个函数作为参数传递给另一个函数,或者从一个函数中返回另一个函数。
以下示例定义了一个 get_full_name() 函数,她可以基于姓氏和名字创建格式化的姓名:
def get_full_name(first_name, last_name, formatter): return formatter(first_name, last_name)
函数 get_full_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}"
接下来的代码使用名字、姓氏以及 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
我们来看以下示例:
callables = [] for i in (1, 2, 3): callables.append(lambda: i) for f in callables: print(f())
以上代码的执行过程如下:
我们期望的输出结果如下:
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 表达式创建时赋值。因此,程序返回了期望的结果。