Python 教程 / lambda表达式

lambda表达式

lambda是Python的匿名函数语法,让你可以用简洁的方式定义小型函数,是函数式编程的重要组成部分。

lambda基础语法

┌─────────────────────────────────────────────────────────────────────┐
│                      lambda 语法图解                                  │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   语法: lambda 参数列表: 表达式                                     │
│                                                                     │
│   等价的 def 函数:                                                  │
│   ┌─────────────────────────────────────────────────────────────┐   │
│   │                                                             │   │
│   │  lambda x, y: x + y                                         │   │
│   │                                                             │   │
│   │         ↓  等价于  ↓                                        │   │
│   │                                                             │   │
│   │  def anonymous(x, y):                                      │   │
│   │      return x + y                                           │   │
│   │                                                             │   │
│   └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
│   关键特性:                                                         │
│   • lambda 是一个表达式,不是一条语句                                │
│   • lambda 返回一个函数对象                                         │
│   • lambda 体是一个单独的表达式,不能包含复杂逻辑                     │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘ 
Python
# 基本 lambda 表达式
square = lambda x: x ** 2
print(square(5))   # 25

# 等价的 def 函数
def square_def(x):
    return x ** 2

# 多参数 lambda
add = lambda x, y: x + y
print(add(3, 4))   # 7

# 无参数 lambda
get_five = lambda: 5
print(get_five())   # 5 

lambda vs def

特性 lambda def
语法形式 表达式 语句
函数体 单个表达式 多条语句
返回方式 隐式返回表达式结果 显式return语句
命名 匿名或赋值给变量 有函数名
适用场景 简单的一次性函数 复杂的可复用函数
可读性 简单场景更简洁 复杂逻辑更清晰

与 sorted() 配合

lambda最常用的场景是为排序函数提供key参数。

┌─────────────────────────────────────────────────────────────────────┐
│                   sorted(key=lambda) 示例                           │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  students = [[("张三", 85), ("李四", 92), ("王五", 78)]            │
│                                                                     │
│  按成绩排序:                                                        │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  sorted(students, key=lambda x: x[1])                       │   │
│  │                                                             │   │
│  │  结果: [[("王五", 78), ("张三", 85), ("李四", 92)]          │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
│  按姓名长度排序:                                                    │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │  sorted(students, key=lambda x: len(x[0]))                  │   │
│  └─────────────────────────────────────────────────────────┘   │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘ 
Python
# 按成绩排序
students = [[("张三", 85), ("李四", 92), ("王五", 78)]
sorted_by_score = sorted(students, key=lambda x: x[1])
print(sorted_by_score)
# [[('王五', 78), ('张三', 85), ('李四', 92)]

# 按姓名长度排序
by_name_len = sorted(students, key=lambda x: len(x[0]))
print(by_name_len)
# [[('王五', 78), ('张三', 85), ('李四', 92)]

# 降序排列
descending = sorted(students, key=lambda x: x[1], reverse=True)
print(descending)
# [[('李四', 92), ('张三', 85), ('王五', 78)] 

与 map/filter 配合

Python
# map + lambda: 转换数据
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x ** 2, numbers))
print(f"平方: {squared}")
# [1, 4, 9, 16, 25]

# filter + lambda: 过滤数据
evens = list(filter(lambda x: x % 2 == 0, numbers))
print(f"偶数: {evens}")
# [2, 4]

# 组合: 先过滤再转换
from functools import reduce
result = reduce(lambda x, y: x + y,
                map(lambda x: x ** 2,
                     filter(lambda x: x % 2 == 0, numbers)))
print(f"偶数的平方和: {result}")
# 20 (4 + 16) 

lambda中的条件表达式

lambda中可以使用条件表达式(三元运算符)。

Python
# 基本条件表达式
# lambda x: 真值 if 条件 else 假值
classify = lambda x: "正数" if x > 0 else "非正数"
print(classify(5))   # 正数
print(classify(-3))  # 非正数

# 取最大值
max_of_two = lambda x, y: x if x > y else y
print(max_of_two(10, 20))   # 20

# 绝对值
abs_value = lambda x: x if x >= 0 else -x
print(abs_value(-5))           # 5

# 嵌套条件
grade = lambda score: "A" if score >= 90 else \
                          "B" if score >= 80 else \
                          "C" if score >= 70 else "D"
print(grade(85))   # B 

lambda与闭包

lambda可以访问其定义作用域中的变量,形成闭包。

┌─────────────────────────────────────────────────────────────────────┐
│                       闭包示意图                                    │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│  def make_multiplier(factor):                                    │
│      return lambda x: x * factor  ◀── factor 来自外部作用域      │
│                                                                     │
│  调用:                                                             │
│  ┌─────────────────────────────────────────────────────────────┐   │
│  │                                                             │   │
│  │  times_3 = make_multiplier(3)                              │   │
│  │  times_5 = make_multiplier(5)                              │   │
│  │                                                             │   │
│  │  times_3(10) ──▶ 10 * 3 = 30                              │   │
│  │  times_5(10) ──▶ 10 * 5 = 50                              │   │
│  │                                                             │   │
│  └─────────────────────────────────────────────────────────────┘   │
│                                                                     │
│  闭包特性: 内部函数记住外部函数的变量                               │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘ 
Python
# 创建多个乘数函数
def make_multiplier(factor):
    return lambda x: x * factor

times_3 = make_multiplier(3)
times_5 = make_multiplier(5)
print(times_3(10))  # 30
print(times_5(10))  # 50

# 计数器
def make_counter():
    count = 0
    return lambda: globals()['count'] if 'count' in globals() else setattr(globals(), 'count', count + 1) or count

# 工厂函数创建加法器
def make_adder(n):
    return lambda x: x + n

add_5 = make_adder(5)
add_10 = make_adder(10)
print(add_5(3))     # 8
print(add_10(3))    # 13 

lambda的限制

  • 只能包含单个表达式,不能包含复杂逻辑
  • 不能包含语句(如if、for、while),但可以使用条件表达式
  • 不能直接赋值给其他变量
  • 调试困难(没有函数名)
Python
# 合法的 lambda
f1 = lambda x: [1, 2, 3][x]  # 可以使用索引
f2 = lambda x: "正数" if x > 0 else "非正数"  # 条件表达式
f3 = lambda x: (x ** 2 for x in range(x))  # 生成器表达式

# lambda 的限制
# 不能赋值: lambda x: x = 5  ❌
# 不能有循环: lambda x: for i in range(x): pass  ❌
# 不能有多条语句: lambda x: if x > 0: return x  ❌ 

章节测验

问题1: lambda表达式是语句还是表达式?

问题2: (lambda x, y: x + y)(3, 4) 的结果是?

问题3: lambda 能包含多条语句吗?

问题4: sorted([3,1,2], key=lambda x: -x) 的结果是?

练习题

练习1: 创建计算器

用lambda创建加减乘除四个函数。

练习2: 复杂排序

按字符串最后一个字符排序。

["apple", "cherry", "banana"] → ["banana", "apple", "cherry"] 
练习3: 闭包工厂

创建一个函数,返回lambda实现指数运算。

🐍 Python 在线代码编辑器
📝 运行结果