匿名函数(lambda)
匿名函数是一种不需要显式定义名称的小型函数,在 Python 中使用关键字 lambda
创建。由于它没有名字,因此被称为匿名函数。
1. 为什么需要匿名函数?
- 匿名函数适合用于那些一次性、简单逻辑的场景。
- 比起普通函数,匿名函数语法更加简洁,代码更清爽。
例如,当我们需要一个临时的函数作为参数传递时,用匿名函数是个不错的选择。
2. 匿名函数的语法
lambda 参数1, 参数2, ... : 表达式
lambda
:匿名函数的关键字。- 参数:可以有多个参数,参数之间用逗号分隔。
- 表达式:是函数的逻辑,仅限一行,结果会自动返回。
示例:加法操作
add = lambda x, y: x + y
print(add(3, 5)) # 输出:8
3. 匿名函数 vs 普通函数
匿名函数只能写单行逻辑,普通函数可以写复杂逻辑。
匿名函数
square = lambda x: x ** 2
print(square(4)) # 输出:16
普通函数
def square(x):
return x ** 2
print(square(4)) # 输出:16
- 相同点:两者的功能相同,都可以返回
x ** 2
。 - 不同点:匿名函数更简洁,但只能写一行代码。
4. 匿名函数的典型应用
1) 在排序中使用
通过 lambda
指定排序规则。
students = [("小明", 85), ("小红", 90), ("小刚", 75)]
students.sort(key=lambda x: x[1]) # 按分数排序
print(students)
输出:
[('小刚', 75), ('小明', 85), ('小红', 90)]
2) 在 map 函数中使用
map
用于将一个函数应用到可迭代对象的每个元素上。
numbers = [1, 2, 3, 4]
squares = map(lambda x: x ** 2, numbers) # 计算平方
print(list(squares))
输出:
[1, 4, 9, 16]
3) 在 filter 函数中使用
filter
用于筛选满足条件的元素。
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = filter(lambda x: x % 2 == 0, numbers) # 筛选偶数
print(list(even_numbers))
输出:
[2, 4, 6]
4) 在 reduce 函数中使用
reduce
用于累积计算。
from functools import reduce
numbers = [1, 2, 3, 4]
product = reduce(lambda x, y: x * y, numbers) # 计算乘积
print(product)
输出:
24
5. 注意事项
只能写一行逻辑:
lambda
表达式限制为单行,如果逻辑复杂,建议使用普通函数。没有名字:匿名函数是临时的,如果需要重复使用,定义普通函数更好。
代码可读性:过多的
lambda
会让代码难以理解。对于复杂逻辑,还是写普通函数更直观。
6. 实际场景示例
结合列表推导式
# 生成一个列表,包含每个数字的平方
numbers = [1, 2, 3, 4]
squares = [lambda x: x ** 2 for x in numbers]
print([f(5) for f in squares]) # 调用每个 lambda 函数
在字典中动态构造键值
# 动态生成键值对
actions = {
"add": lambda x, y: x + y,
"subtract": lambda x, y: x - y,
}
print(actions["add"](10, 5)) # 输出:15
print(actions["subtract"](10, 5)) # 输出:5
7. 总结
- 匿名函数是简洁的小型函数,适合临时使用。
- 在排序、筛选、映射、累积等场景中常用。
- 如果逻辑复杂或需要复用,建议用普通函数代替。
匿名函数让 Python 代码更优雅,但要在简洁性和可读性之间找到平衡!