一、匿名函数(lambda)核心讲解
匿名函数(lambda 表达式)是 Python 中一种轻量级、无需定义函数名的函数形式,核心作用是快速创建简单的一次性函数,常配合 map()、filter()、sorted() 等内置函数使用。
1. 基本语法
lambda 参数列表: 表达式
- 参数列表:可以是 0 个、1 个或多个参数(和普通函数一致);
- 表达式:必须是单行(不能写循环、分支等复杂逻辑),执行后自动返回结果(无需写
return); - 无函数名:lambda 本身是一个表达式,执行后直接返回函数对象,通常直接使用或赋值给变量。
2. 对比普通函数,理解匿名函数
| 普通函数 | 匿名函数(lambda) |
|---|---|
def add(a, b): | lambda a, b: a + b |
return a + b | 无函数名,单行完成逻辑 |
| 可写复杂逻辑(循环 / 分支) | 仅支持单行表达式 |
| 可重复调用 | 适合一次性使用,或简化代码 |
示例 1:基础使用
# 1. 无参数
hello = lambda: "Hello, Python!"
print(hello()) # 输出:Hello, Python!
# 2. 单个参数
square = lambda x: x * x
print(square(5)) # 输出:25
# 3. 多个参数
add = lambda a, b, c: a + b + c
print(add(1, 2, 3)) # 输出:6
3. 匿名函数的典型应用场景
匿名函数很少单独使用,核心价值是配合内置函数简化代码,以下是最常用的场景:
场景 1:配合 sorted () 自定义排序规则
# 对列表嵌套的元组,按元组第二个元素排序
students = [("小明", 90), ("小红", 85), ("小刚", 95)]
# 普通函数写法
def get_score(student):
return student[1]
sorted_students1 = sorted(students, key=get_score)
# lambda 简化写法
sorted_students2 = sorted(students, key=lambda x: x[1])
print(sorted_students2) # 输出:[('小红', 85), ('小明', 90), ('小刚', 95)]
注:sort () 和 sorted () 核心区别
| 特性 | sort() | sorted() |
|---|---|---|
| 所属对象 | 列表(list)的内置方法(仅列表能用) | Python 内置函数(所有可迭代对象都能用:列表、元组、字符串、字典等) |
| 是否修改原数据 | 原地排序(直接修改原列表,无返回值) | 不修改原数据,返回一个新的排序后列表 |
| 返回值 | None(没有返回值) | 排序后的新列表 |
| 使用语法 | 列表.sort (key=..., reverse=...) | sorted (可迭代对象,key=..., reverse=...) |
场景 2:配合 map () 批量处理数据
# 将列表中所有数字翻倍
nums = [1, 2, 3, 4]
# 普通函数写法
def double_num(x):
return x * 2
result1 = list(map(double_num, nums))
# lambda 简化写法
result2 = list(map(lambda x: x * 2, nums)))
print(result2) # 输出:[2, 4, 6, 8]
场景 3:配合 filter () 过滤数据
# 筛选列表中的偶数
nums = [1, 2, 3, 4, 5, 6]
# lambda 写法
result = list(filter(lambda x: x % 2 == 0, nums))
print(result) # 输出:[2, 4, 6]
4. 注意事项
- lambda 表达式仅支持单行表达式,不能写
if-else以外的分支、循环(if-else可简写为三元表达式):
# 合法:三元表达式
func = lambda x: "偶数" if x % 2 == 0 else "奇数"
print(func(3)) # 输出:奇数
# 非法:多行逻辑(需改用普通函数)
# func = lambda x:
# if x > 0:
# return "正数"
-
不要滥用 lambda:如果逻辑复杂(超过单行),或需要重复调用,建议用
def定义普通函数(可读性更高); -
lambda 可以作为函数参数传递(如上述
sorted/filter/map),这是其最核心的使用场景。
三、总结(核心要点)
- lambda 本质:无函数名的单行函数,语法为
lambda 参数: 表达式,自动返回表达式结果; - 核心场景:配合
sorted()/map()/filter()简化代码,实现自定义排序、批量处理、数据过滤; - 使用原则:仅用于简单逻辑,复杂逻辑(多行、循环)优先用普通函数(
def),保证代码可读性。