一、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
四、使用注意事项
- lambda 适合简单逻辑,复杂计算/多分支判断优先用普通函数。
map/filter结果是迭代器,需用list()转为列表查看。reduce多用于累加、累乘、拼接等聚合场景。- 日常开发中,
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]