跳转至

Lambda 匿名函数

在Python中,lambda是一种用于创建 匿名函数(即没有名称的函数)的关键字。它通常用于简化代码,特别是在需要短小函数的地方(如高阶函数的参数)。

理解:普通表达式的本质就是一个匿名函数(如 a ** n + 1 可以看做以 an 为参数的函数,返回一个数);lambda 表达式只是将普通表达式显式地包装成一个只有 return 的函数,从而用于只接受 函数对象 作为参数的地方(如 sort 函数的 key 参数)。


1. 语法

lambda 参数1, 参数2, ... : 表达式

特点

• 没有函数名,但可以赋值给变量。

• 只能包含**一个表达式**,不能包含returnif-else 语句块(但可以用三元运算符)、循环等复杂逻辑。

• 自动返回表达式的结果。

• 通常用作 map()filter()sorted() 等高阶函数的参数。

2. 用法

(1) 基本用法

1
2
3
# 定义一个 lambda 函数,计算两数之和
add = lambda x, y: x + y
print(add(3, 5))  # 输出: 8

• 其中 add = lambda x, y: x + y相当于:

def add(x, y):
  return x + y

lambda 表达式赋值给变量实际上是创建了一个函数对象,用 def 语句定义函数也是创建了一个函数对象。由此可见,python 中万物皆对象,就算函数也是一种对象。

(2) 作为map等高阶函数的参数

# 1. 使用 lambda 作为 map() 的参数
nums = [1, 2, 3, 4]
squared = list(map(lambda x: x ** 2, nums))
print(squared)  # 输出: [1, 4, 9, 16]

# 2. 使用 lambda 作为 filter() 的参数
even_nums = list(filter(lambda x: x % 2 == 0, nums))
print(even_nums)  # 输出: [2, 4]

# 3. 使用 lambda 作为 sort() 或 sorted() 的 key
students = [("Alice", 90), ("Bob", 85), ("Charlie", 92)]
students.sort(key=lambda x: x[1])  # 按分数排序
print(students)  # 输出: [('Bob', 85), ('Alice', 90), ('Charlie', 92)]
print(sorted(students, key=lambda x: x[1]))  
# 同样输出: [('Bob', 85), ('Alice', 90), ('Charlie', 92)]

(3) 条件表达式(三元运算符)

1
2
3
4
# 判断数字是奇数还是偶数
check_odd = lambda x: "奇数" if x % 2 != 0 else "偶数"
print(check_odd(5))  # 输出: "奇数"
print(check_odd(4))  # 输出: "偶数"

(4) 默认参数

1
2
3
4
# lambda 也可以有默认参数
greet = lambda name, greeting="Hello": f"{greeting}, {name}!"
print(greet("Alice"))  # 输出: "Hello, Alice!"
print(greet("Bob", "Hi"))  # 输出: "Hi, Bob!"

3. lambda 与 def 函数的对比

特性 lambda def
函数名 匿名(但可赋值给变量) 必须有名称
代码块 仅限单行表达式 可包含多行语句、复杂逻辑
返回值 自动返回表达式结果 需显式return
文档字符串 不支持 支持(通过__doc__
适用场景 简单操作、临时函数 复杂逻辑、复用函数
可读性 简单场景更简洁 复杂场景更清晰

4. 适用场景

  • 适合用 lambda 的情况

    • 短小的函数,如map()filter()sorted()的参数。

    • 临时函数,不需要复用。

    • 简单的条件判断(三元运算符)。

  • 不适合用 lambda 的情况

    • 需要多行逻辑的函数。

    • 需要复用或调试的函数。

    • 需要文档说明的函数。


5. 注意事项

  1. 避免滥用 lambda:如果逻辑复杂,用def更清晰。
  2. 调试困难lambda报错时显示<lambda>,不易追踪。
  3. 性能差异lambdadef在运行速度上几乎没有区别。