函数式组合是构建数据流水线,用pipe或compose将单参数纯函数首尾连接;pipe从左到右执行更符合直觉,需遵守单输入、无副作用约定,多参函数可用partial或lambda适配。

函数式组合不是把函数堆在一起,而是让数据像水一样流过一层层变换,每一步只专注一个职责,最终自然得到结果。
用高阶函数搭出“数据流水线”
核心是把函数当作零件,用 compose 或 pipe 把它们首尾咬合。Python 本身不内置,但几行就能写出来:
- pipe(f, g, h) 表示 h(g(f(x))),数据从左往右流
- compose(h, g, f) 表示 h(g(f(x))),逻辑从右往左读(数学习惯)
- 推荐用 pipe,更符合阅读顺序,也贴合“流水线”的直觉
让每个函数都“可拼接”
能进流水线的函数,得遵守两个简单约定:
- 只接收一个参数(通常是上一步的输出),返回一个值
- 避免副作用:不改全局变量、不 print、不写文件——纯函数才可靠
- 遇到多参函数?用 functools.partial 或 lambda “锁住”其他参数,留下一个入口
真实场景:一行代码处理字符串
比如清洗用户输入:去空格 → 转小写 → 去标点 → 分词 → 去停用词。不用嵌套调用,也不用临时变量:
立即学习“Python免费学习笔记(深入)”;
- pipe(strip, str.lower, remove_punct, str.split, filter_stopwords)(' Hello, World! ')
- 每步独立测试、单独复用,改其中一环不影响其余;加日志?在任意环节包一层 wrapper 就行
- 和 pandas 的 .pipe() 或 PySpark 的链式 API 本质一致,只是更轻量、更通用
别硬套,该用就用,该停就停
流水线不是银弹。三步以内的简单处理,直接写反而清楚;涉及状态、IO 或分支逻辑时,强行扁平化会让代码难懂。关键是识别“线性变换序列”这个模式——当发现你在反复写 result = f(g(h(x))),就是组合该出场的时候。










