匿名函数 lambda + 高阶函数

一、lambda 匿名函数

1. 语法

python 复制代码
lambda 参数列表: 表达式
  • 无函数名,只能写单行表达式 ,不能用 if/for/while 等代码块
  • 自动返回表达式结果,无需 return

2. 基础示例

python 复制代码
# 无参
f1 = lambda: 100
print(f1())  # 100

# 单个参数
f2 = lambda x: x * 2
print(f2(3)) # 6

# 多个参数
f3 = lambda x, y: x + y
print(f3(2, 5)) # 7

# 带简单条件表达式(三元运算)
f4 = lambda x: "偶数" if x % 2 == 0 else "奇数"
print(f4(4)) # 偶数

二、高阶函数

定义 :接收函数作为参数 / 返回函数的函数。

Python 内置常用高阶函数:sorted()map()filter()reduce()

1. sorted() 排序(最常用)

作用:对可迭代对象排序,key 指定排序规则,reverse 控制升降序。

python 复制代码
# 1. 按元素本身排序
lst = [5, 2, 9, 1]
print(sorted(lst))  # [1, 2, 5, 9]

# 2. 按元组第二个元素排序
data = [(1, 3), (4, 1), (2, 5)]
res = sorted(data, key=lambda x: x[1])
print(res)  # [(4, 1), (1, 3), (2, 5)]

# 3. 降序排序
res2 = sorted(data, key=lambda x: x[1], reverse=True)
print(res2) # [(2, 5), (1, 3), (4, 1)]

# 4. 按字符串长度排序
words = ["apple", "hi", "banana"]
res3 = sorted(words, key=lambda s: len(s))
print(res3) # ['hi', 'apple', 'banana']

2. map() 映射转换

作用:遍历序列,用函数处理每个元素,返回迭代器。

语法:map(函数, 可迭代对象)

python 复制代码
# 所有元素 *2
nums = [1, 2, 3]
res = map(lambda x: x * 2, nums)
print(list(res))  # [2, 4, 6]

# 多个序列并行处理
a = [1, 2]
b = [10, 20]
res2 = map(lambda x,y: x+y, a, b)
print(list(res2)) # [11, 22]

3. filter() 过滤筛选

作用:根据函数返回的布尔值 保留元素,True 则留下。

语法:filter(判断函数, 可迭代对象)

python 复制代码
# 保留偶数
nums = [1,2,3,4,5,6]
res = filter(lambda x: x % 2 == 0, nums)
print(list(res)) # [2, 4, 6]

# 筛选长度大于2的字符串
words = ["a", "ab", "abc", "abcd"]
res2 = filter(lambda s: len(s) > 2, words)
print(list(res2)) # ['abc', 'abcd']

4. reduce() 累积运算

作用:依次对相邻元素做累积计算,最终返回单个值

注意:Python3 中 reduce 移到 functools 模块,需要手动导入。

python 复制代码
from functools import reduce

# 累加求和
nums = [1,2,3,4]
res = reduce(lambda x,y: x+y, nums)
print(res) # 1+2+3+4 = 10

# 累乘
res2 = reduce(lambda x,y: x*y, nums)
print(res2) # 24

# 带初始值
res3 = reduce(lambda x,y: x+y, nums, 10)
print(res3) # 10+1+2+3+4 = 20

三、综合实战练习

练习1:字典列表排序

python 复制代码
students = [
    {"name": "Tom", "age": 20},
    {"name": "Jack", "age": 18},
    {"name": "Lily", "age": 19}
]
# 按年龄升序
s_stu = sorted(students, key=lambda d: d["age"])
print(s_stu)

练习2:数组转平方列表

python 复制代码
arr = [-3, -2, 0, 1, 4]
square = list(map(lambda x: x**2, arr))
print(square) # [9, 4, 0, 1, 16]

练习3:筛选大于5的数字并求和

python 复制代码
from functools import reduce

data = [2, 7, 1, 8, 6, 3]
# 先过滤,再累加
f_data = filter(lambda x: x > 5, data)
total = reduce(lambda a,b: a+b, f_data)
print(total) # 7+8+6 = 21

四、使用注意事项

  1. lambda 适合简单逻辑,复杂计算/多分支判断优先用普通函数。
  2. map/filter 结果是迭代器,需用 list() 转为列表查看。
  3. reduce 多用于累加、累乘、拼接等聚合场景。
  4. 日常开发中,sorted + lambda 出场率最高。

五、对比:推导式替代 map/filter

很多场景下列表推导式可读性更强,可替代 map/filter

python 复制代码
nums = [1,2,3,4]

# map 写法
m = list(map(lambda x:x*2, nums))
# 列表推导式写法
m2 = [x*2 for x in nums]

# filter 写法
f = list(filter(lambda x:x>2, nums))
# 列表推导式写法
f2 = [x for x in nums if x>2]

print(m, m2)   # [2, 4, 6, 8] [2, 4, 6, 8]
print(f, f2)   # [3, 4] [3, 4]
相关推荐
兵慌码乱12 小时前
基于 MediaPipe 与 PySide2 的手势交互音乐控制系统实现:轻量化视觉交互全流程解析
python·opencv·计算机视觉·人机交互·手势识别·mediapipe·pyside2
小bo波13 小时前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
luckdewei14 小时前
FastAPI 资产管理系统实战:复杂 ORM 关联、Alembic 迁移与 N+1 查询优化
python
aqi0020 小时前
15天学会AI应用开发(八)使用向量数据库实现RAG功能
人工智能·python·大模型·ai编程·ai应用
Csvn21 小时前
`functools.lru_cache` —— 一行代码搞定缓存加速
后端·python
JieE2121 天前
LeetCode 101. 对称二叉树|JS 递归 + 迭代双解法,彻底搞懂镜像判断
javascript·算法
nanxun8862 天前
记一次诡异的 Docker 容器"串包"故障排查
java
金銀銅鐵2 天前
[Python] 从《千字文》中随机挑选汉字
后端·python
用户1563068103512 天前
Day01 | Java 基础(Java SE)
java