itertools 与 functools:Python 函数式编程的妙用
·
itertools 与 functools:Python 函数式编程的妙用
Python 的 itertools 和 functools 模块为函数式编程提供了强大工具,通过组合函数、惰性计算和高效操作简化复杂逻辑。下面分步解析其核心功能与应用场景:
1. itertools:迭代器工具库
核心思想:通过惰性计算生成数据流,避免内存溢出。
常用工具:
-
组合生成器:
- 排列:
permutations('AB', 2) → ('A','B'), ('B','A') - 组合:
combinations('ABC', 2) → ('A','B'), ('A','C'), ('B','C') - 笛卡尔积:
product([1,2], repeat=2) → (1,1), (1,2), (2,1), (2,2) - 数学背景:$n$ 个元素的 $k$ 组合数为 $\binom{n}{k} = \frac{n!}{k!(n-k)!}$
- 排列:
-
无限迭代器:
from itertools import count, cycle # 生成自然数序列 for i in count(start=0, step=2): # 0, 2, 4, ... if i > 10: break # 循环遍历列表 cycle(['A','B']) # 'A', 'B', 'A', 'B'... -
数据切片与过滤:
from itertools import islice, takewhile # 惰性切片 islice(count(), 5, 10) # 生成 5~9 # 条件截断 takewhile(lambda x: x<5, [1,3,6,2]) # 1, 3 (遇到6终止)
2. functools:高阶函数操作
核心思想:将函数视为一等对象,支持函数组合与部分应用。
关键工具:
-
函数包装器:
@lru_cache(maxsize=128)
缓存函数结果,优化递归计算(如斐波那契数列):@lru_cache def fib(n): return n if n < 2 else fib(n-1) + fib(n-2) -
偏函数:
partial(func, *args)
冻结部分参数,创建新函数:from functools import partial pow_2 = partial(pow, exp=2) # 固定指数为2 pow_2(3) # 9 (等价于 pow(3, exp=2)) -
函数归约:
reduce(func, sequence)
累积操作序列(如连乘):from functools import reduce reduce(lambda x, y: x*y, [1,2,3,4]) # 24 (1*2*3*4)数学表达:
$$ \text{reduce}(f, [a_1, a_2, \dots, a_n]) = f(f(\cdots f(a_1, a_2), \cdots), a_n) $$
3. 联合应用示例:数据流处理
结合两模块实现高效管道:
from itertools import groupby
from functools import reduce
# 按奇偶性分组求和
data = [1, 2, 3, 4, 5]
grouped = groupby(sorted(data), key=lambda x: x % 2) # 分组为(0: [2,4]), (1: [1,3,5])
sums = {k: reduce(lambda a,b: a+b, g) for k, g in grouped} # {0:6, 1:9}
4. 函数式编程优势
- 声明式风格:专注“做什么”而非“如何做”(如
reduce替代循环) - 资源优化:
itertools惰性计算节省内存 - 代码复用:
partial和函数组合提升模块化
通过灵活运用这些工具,可高效解决迭代处理、状态管理和算法优化等问题,体现函数式编程的简洁与威力。
更多推荐


所有评论(0)