匿名函数(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. 注意事项

  1. 只能写一行逻辑lambda 表达式限制为单行,如果逻辑复杂,建议使用普通函数。

  2. 没有名字:匿名函数是临时的,如果需要重复使用,定义普通函数更好。

  3. 代码可读性:过多的 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 代码更优雅,但要在简洁性可读性之间找到平衡!