Python 中匿名函数(lambda 表达式)的用法详解
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 定义更清晰)。
更多推荐

所有评论(0)