lambda 表达式 - 匿名函数

Python 中的 lambda 表达式是匿名函数的语法形式,常用于简洁地定义一次性的小函数

分类: basics 难度: 入门 更新: 2024-01-15
lambda 匿名函数 函数式编程 表达式

lambda 表达式 - 匿名函数

📝 概述

lambda 表达式用于创建匿名函数,适合在只使用一次或简单函数逻辑的场景,能够让代码更简洁,尤其在函数式编程风格中与 filter、map、sorted、reduce 等函数配合使用更为便捷。

🎯 学习目标

  • 掌握 lambda 表达式的基本语法
  • 理解 lambda 与普通函数的区别与使用场景
  • 学会将 lambda 与内置函数结合使用
  • 掌握排序、过滤、映射等常见操作中的 lambda 用法

📋 前置知识

  • Python 函数定义与调用
  • 基本的列表、字典等数据结构
  • 表达式与运算符

🔍 详细内容

基本语法

lambda 参数列表: 表达式
  • lambda 表达式只包含一个表达式,该表达式的计算结果就是函数的返回值
  • 不能包含赋值语句、while/for 等复杂语句

示例:与普通函数等价

# 使用普通函数定义加法

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

# 使用 lambda 定义加法
add_lambda = lambda x, y: x + y

print(add(2, 3))        # 输出: 5
print(add_lambda(2, 3)) # 输出: 5

常见用法

1) filter 与 lambda:过滤数据

# 过滤出偶数
nums = [1, 2, 3, 4, 5, 6]
result = list(filter(lambda x: x % 2 == 0, nums))
print(result)  # 输出: [2, 4, 6]

2) map 与 lambda:映射转换

# 所有元素平方
nums = [1, 2, 3, 4]
result = list(map(lambda x: x ** 2, nums))
print(result)  # 输出: [1, 4, 9, 16]

3) sorted 与 lambda:自定义排序

# 按元组的第二个元素排序
pairs = [("a", 3), ("b", 1), ("c", 2)]
print(sorted(pairs, key=lambda x: x[1]))  # 输出: [('b', 1), ('c', 2), ('a', 3)]

# 按字符串长度排序
words = ["apple", "fig", "banana"]
print(sorted(words, key=lambda w: len(w)))  # 输出: ['fig', 'apple', 'banana']

4) reduce 与 lambda:聚合计算

from functools import reduce

# 求和
nums = [1, 2, 3, 4]
s = reduce(lambda acc, x: acc + x, nums, 0)
print(s)  # 输出: 10

进阶技巧

条件表达式(类似三元运算)

# 根据条件返回不同的结果
f = lambda x: "偶数" if x % 2 == 0 else "奇数"
print(f(3))  # 输出: 奇数

结合 list.sort 进行原地排序

# 学生列表,按分数倒序,再按年龄升序
students = [
    {"name": "Alice", "score": 90, "age": 20},
    {"name": "Bob", "score": 95, "age": 19},
    {"name": "Carol", "score": 95, "age": 21},
]

# 使用元组作为排序键,先比较分数的负值实现倒序,再按年龄正序
students.sort(key=lambda s: (-s["score"], s["age"]))
print(students)
# 输出: [{'name': 'Bob', 'score': 95, 'age': 19}, {'name': 'Carol', 'score': 95, 'age': 21}, {'name': 'Alice', 'score': 90, 'age': 20}]

与字典/列表推导式配合

# 根据复杂规则生成字典
keys = ["a", "b", "c"]
values = [1, 2, 3]
rule = lambda k, v: (k.upper(), v * v)
result = {rule(k, v)[0]: rule(k, v)[1] for k, v in zip(keys, values)}
print(result)  # 输出: {'A': 1, 'B': 4, 'C': 9}

与内置函数的配合示例

# max/min 的 key 参数
nums = ["alpha", "beta", "gamma", "d"]
print(max(nums, key=lambda s: len(s)))  # 输出: gamma
print(min(nums, key=lambda s: len(s)))  # 输出: d

⚠️ 注意事项

  • lambda 适合简单逻辑,复杂逻辑请使用 def 定义具名函数,提升可读性
  • lambda 只能写表达式,不能包含赋值、多条语句或注释块
  • 在调试时,lambda 没有函数名,调用栈定位不如具名函数直观

🔗 相关内容

📚 扩展阅读

  • Python 官方文档:lambda 表达式
  • 《流畅的 Python》:函数式编程章节

🏷️ 标签

lambda 匿名函数 函数式编程 表达式 排序 过滤 映射


最后更新: 2024-01-15
作者: Python 文档团队
版本: 1.0

作者: Python 文档团队

版本: 1.0

讨论与反馈

欢迎在下方留言讨论,分享你的学习心得或提出问题。评论基于GitHub Issues,需要GitHub账号。