Lambda 表达式(也称为匿名函数)是 Python 中用于创建小型、一次性使用的匿名函数的一种简洁方式。它们使用 lambda 关键字定义,不需要使用 def 关键字来正式定义函数。

一、lambda 表达式的基本语法

lambda 参数列表: 表达式
  • lambda:定义匿名函数的关键字(类似于 def)。
  • 参数列表:与普通函数的参数规则一致,可包含位置参数、默认参数、*args**kwargs 等(但通常参数较少)。
  • 表达式:函数的返回值,必须是单个表达式(不能包含循环、条件语句块等复杂逻辑),表达式的结果会自动作为返回值(无需写 return)。

二、lambda 与普通函数的对比

def calc(num1, num2):
    return num1 + num2

print(type(calc)) # <class 'function'>

s = lambda num1, num2: num1 + num2
print(type(s)) # <class 'function'>

lambda 表达式的返回结果是一个函数对象(类型为 function,它和用 def 定义的普通函数在类型上完全一致。因此,使用 lambda 表达式定义的 “匿名函数”,本质上也是一个函数,必须通过 “函数名(或变量名)+ 参数” 的方式调用

两者调用方式完全相同:

print(calc(1, 2))  # 输出:3
print(s(1, 2))  # 输出:3

三、lambda 表达式的特点

1.匿名性 没有函数名,只能通过赋值给变量作为参数传递使用

2. 简洁性 :一行代码完成简单逻辑,无需写 def、函数名和 return

3. 表达式限制 :只能包含一个表达式,不能有循环、分支语句块,只能写单行表达式形式、赋值语句等。

4. 作用域 :与普通函数一样,遵循 LEGB 作用域规则(局部→嵌套→全局→内置)。

lambda 函数直接作为参数传递给函数使用:

def calc(num1, num2):
    return num1 + num2

def apply_func(func, a, b):
    return func(a, b)  # 调用传入的函数

# 传递普通函数
print(apply_func(calc, 3, 4))  # 输出:7

# 传递 lambda 函数(直接写,无需赋值给变量)
print(apply_func(lambda x, y: x * y, 3, 4))  # 输出:12(调用 lambda 计算乘积)

这里 lambda 函数直接作为参数传递给 apply_func,虽然没有赋值给变量,但本质上仍是一个函数对象,被 func 参数接收后正常调用。

四、lambda 表达式的参数用法

lambda 支持多种参数形式,与普通函数的参数规则一致:

1. 无参数
hello = lambda: "Hello, World!"
print(hello())  # 输出:Hello, World!
2. 位置参数
multiply = lambda x, y: x * y
print(multiply(4, 5))  # 输出:20
3. 默认参数
power = lambda x, n=2: x **n  # n 的默认值为 2(平方)
print(power(3))      # 输出:9(3²)
print(power(3, 3))   # 输出:27(3³)
4. 可变位置参数(*args
sum_args = lambda* args: sum(args)  # 计算任意多个数的和
print(sum_args(1, 2, 3))  # 输出:6
print(sum_args(10, 20))   # 输出:30
5. 可变关键字参数(** kwargs
print_kwargs = lambda **kwargs: [f"{k}={v}" for k, v in kwargs.items()]
print(print_kwargs(name="Alice", age=25))  # 输出:['name=Alice', 'age=25']

五、lambda 与条件表达式结合

lambda 只能包含一个表达式,但可以嵌套条件表达式(单行的 if...else...),实现简单的分支逻辑。语法:lambda 参数: 表达式1 if 条件 else 表达式2

注意:lambda 中不能用多行 if...elif...else 块,只能用单行条件表达式。

# 求两个数中的较大值
max_num = lambda a, b: a if a > b else b
print(max_num(5, 3))  # 输出:5
print(max_num(2, 7))  # 输出:7

# 判断奇偶性
is_even = lambda x: "偶数" if x % 2 == 0 else "奇数"
print(is_even(4))  # 输出:偶数
print(is_even(7))  # 输出:奇数

六、lambda 的典型使用场景

lambda 表达式的核心价值在于简化代码尤其适合作为 “临时函数” 传递给其他函数(如排序、映射、过滤等场景)。

1. 配合 sorted() 排序

sorted() 函数的 key 参数需要一个函数来指定排序依据,用 lambda 可以快速定义这个函数。

示例:按列表中元组的第二个元素排序

pairs = [(1, 3), (2, 1), (3, 2)]
# 普通函数写法
def get_second(element):
    return element[1]
sorted_pairs = sorted(pairs, key=get_second)

# lambda 简化写法
sorted_pairs = sorted(pairs, key=lambda x: x[1])
print(sorted_pairs)  # 输出:[(2, 1), (3, 2), (1, 3)]
2. 配合 map() 映射

map() 函数需要一个函数对可迭代对象的每个元素做转换,lambda 可直接定义转换逻辑。

示例:将列表中所有元素乘以 2

numbers = [1, 2, 3, 4]
# 普通函数写法
def double(x):
    return x * 2
result = list(map(double, numbers))

# lambda 简化写法
result = list(map(lambda x: x * 2, numbers))
print(result)  # 输出:[2, 4, 6, 8]
3. 配合 filter() 过滤

filter() 函数需要一个函数判断元素是否保留,lambda 可快速定义判断逻辑。

示例:筛选列表中的偶数

numbers = [1, 2, 3, 4, 5, 6]
# 普通函数写法
def is_even(x):
    return x % 2 == 0
result = list(filter(is_even, numbers))

# lambda 简化写法
result = list(filter(lambda x: x % 2 == 0, numbers))
print(result)  # 输出:[2, 4, 6]
4. 作为函数返回值

当一个函数需要动态生成另一个简单函数时,lambda 比 def 更简洁。

示例:生成一个 “加法器” 函数

def make_adder(n):
    # 返回一个 lambda 函数,接收 x 并返回 x + n
    return lambda x: x + n

add5 = make_adder(5)  # 生成一个加 5 的函数
print(add5(3))  # 输出:8(3 + 5)
print(add5(10)) # 输出:15(10 + 5)

七、lambda 的局限性

虽然 lambda 很简洁,但也有明显的不足,不能替代普通函数:

1. 功能单一 :只能包含一个表达式,无法实现复杂逻辑(如循环、多行分支、异常处理等)。

2. 可读性限制 :如果逻辑较复杂,lambda 会比 def 定义的函数更难读懂。

3. 无法复用 :匿名函数没有名字,若需要多次调用,必须赋值给变量(此时不如直接用 def 定义更清晰)。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐