匿名函数 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]
相关推荐
vb2008111 小时前
FastAPI APIRouter
开发语言·python
東雪木1 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
adrninistrat0r1 小时前
Java调用链MCP分析工具
java·python·ai编程
我叫袁小陌1 小时前
算法解题思路指南
算法
地平线开发者2 小时前
Conv+BN+Add+ReLU 融合机制简介
算法·自动驾驶
yuanyuan2o22 小时前
模型预训练:Hugging Face Transformers 基础
算法·ai·语言模型·自然语言处理·nlp·深度优先
杨充2 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
噜噜噜阿鲁~2 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言