函数式特性
lambdas、decorators、comprehensions、iterators、context-manager。
30 分钟
函数式编程工具
Python 不是纯函数式语言,但 map/filter/reduce、生成器、functools、itertools` 能写出简洁且内存友好的数据处理管线。基础函数见 python-fundamentals;Agent 链式调用与函数组合思想相通,参考 ai-agents-essentials;/roadmaps/python。
学习目标
- 熟练使用生成器与 yield from 处理大文件/流式数据
- 用 functools.partial、lru_cache 复用与缓存
- 用 itertools 组合迭代器,避免中间 list
生成器
from pathlib import Path
def iter_lesson_lines(draft_dir: Path):
for path in sorted(draft_dir.glob("*.md")):
with path.open(encoding="utf-8") as f:
for line in f:
yield path.name, line.rstrip("\n")
# 内存恒定,不必一次读入全部文件
for name, line in iter_lesson_lines(Path("drafts")):
if line.startswith("#"):
print(name, line)
functools
from functools import partial, lru_cache
def greet(greeting: str, name: str) -> str:
return f"{greeting}, {name}"
hello = partial(greet, "Hello")
print(hello("CodeRoadMap"))
@lru_cache(maxsize=128)
def fib(n: int) -> int:
if n < 2:
return n
return fib(n - 1) + fib(n - 2)
itertools 组合
import itertools
tags = ["python", "async", "typing"]
levels = ["intro", "advanced"]
for tag, level in itertools.product(tags, levels):
print(f"{tag}-{level}")
# 滑动窗口
data = [1, 2, 3, 4, 5]
windows = list(itertools.pairwise(data)) # [(1,2), (2,3), ...]
列表推导可读性高;数据量大或需惰性求值时优先生成器。
练习
- 用生成器统计目录下所有
.md的总行数,不一次性加载全文 - 用
functools.reduce求列表乘积 - 用
itertools.groupby按首字母分组字符串列表
小结
函数式工具让数据流清晰、内存可控。 下一课 asyncio 把「惰性迭代」思想延伸到 I/O 并发。
加载本节练习…