函数组合是将多个单职责、无副作用的纯函数按顺序串联,形成“输入→变换→输出”的清晰流水线;每个函数只接收一个参数、返回一个值,可用pipe实现短路执行与灵活扩展。

函数组合的核心,是把多个单职责、无副作用的纯函数像齿轮一样咬合起来,让数据从一端流入、依次经过每道处理环节、最终输出结果。它不依赖状态或中间变量,靠的是“输入→变换→输出”的清晰链条。
明确每个环节只做一件事
流水线能跑起来,前提是每个函数都足够简单、边界清晰。比如清洗用户昵称,可拆成:
- trim:去掉首尾空格
- normalize_case:统一转小写
- replace_emoji:用占位符替换表情符号
- validate_length:长度在 2–20 字之间才保留,否则返回 None
每个函数只接收一个字符串,只返回一个值(或 None),不读写文件、不修改全局变量、不打印日志。
用 pipe 或 compose 连接函数
Python 没有内置组合函数,但几行就能写出来。推荐用 pipe,顺序更直观:
def pipe(x, *funcs):
for f in funcs:
x = f(x)
if x is None: # 短路退出,适合验证类环节
break
return x
<h1>使用示例</h1><p>cleaned = pipe(" HELLO ? WORLD! ",
str.strip,
str.lower,
lambda s: s.replace("?", "[EMOJI]"),
lambda s: s if 2 </p><p>注意:多参数函数(如 <code>str.replace(old, new)</code>)需用 <code>lambda</code> 或 <code>functools.partial</code> 固定部分参数,只留一个入口接收上游数据。</p><h3>让流水线可测试、可插拔</h3><p>每个函数都能单独运行和单元测试。比如验证函数:</p>
validate_length("a") → Nonevalidate_length("abc") → "abc"
要加日志?在任意环节外再包一层:
def with_log(f, name):
def wrapper(x):
print(f"[{name}] input: {repr(x)}")
result = f(x)
print(f"[{name}] output: {repr(result)}")
return result
return wrapper
<p>pipe(" Hi ",
with_log(str.strip, "trim"),
with_log(str.lower, "lower"))
</p>
要临时跳过某步?直接删掉那个函数即可,不影响其余逻辑。
警惕不适合组合的场景
不是所有逻辑都适合塞进流水线:
- 需要根据上一步结果决定走哪条分支(如“金额>1000 走风控,否则走普通流程”)——这时更适合策略模式或显式 if
- 涉及外部 IO(如查数据库、调 API)——纯函数原则被打破,应提前收口为“获取数据”这一个原子步骤
- 只有 1–2 步简单操作——硬套 pipe 反而增加理解成本,直接链式调用更清楚
关键识别信号是:你是否反复写出 f(g(h(x))) 这样的嵌套?如果是,组合就值得引入。










