在函数式编程与日常Python开发中,把多个小型函数组合成一个处理流程,或者让方法支持连续调用,是提升代码可读性的重要方式。函数组合关注于将数据依次穿过若干个函数,链式调用则强调对象方法返回可继续操作自身的引用。

什么是函数组合模式
函数组合是指将多个函数合并为一个新函数,使输入数据依次经过各个函数处理。假设有函数 f 和 g,组合后相当于执行 g(f(x))。在Python里,我们可以借助高阶函数轻松实现。
基础函数组合实现
下面代码展示了一个简单的 compose 函数,它接收多个函数并从右到左依次执行:
def compose(*funcs):
# 从右向左组合函数
def inner(x):
result = x
for f in reversed(funcs):
result = f(result)
return result
return inner
def add_one(n):
return n + 1
def mul_two(n):
return n * 2
# 先加1再乘2
pipeline = compose(mul_two, add_one)
print(pipeline(3)) # 输出 8
链式调用的实现方式
链式调用常见于面向对象设计,核心是每个方法在处理完后返回 self,从而可以继续调用下一个方法。
使用类实现链式调用
以下示例构建一个简单的文本处理器,支持连续调用:
class TextBuilder:
def __init__(self, text=''):
self.text = text
def append(self, s):
self.text += s
return self # 返回自身以支持链式调用
def upper(self):
self.text = self.text.upper()
return self
def show(self):
return self.text
tb = TextBuilder()
result = tb.append('hello').append(' ').append('world').upper().show()
print(result) # 输出 HELLO WORLD
用装饰器辅助函数组合
装饰器本身是高阶函数,可以用来包装函数,形成组合关系。比如记录函数执行日志:
def logger(func):
def wrapper(x):
print('call', func.__name__)
return func(x)
return wrapper
@logger
def square(n):
return n * n
print(square(4)) # 先打印日志再返回16
组合与链式调用的选择
如果函数之间无状态依赖,优先使用函数组合保持纯函数特性;若操作围绕同一对象状态展开,链式调用更直观。实际项目中两者可混用,例如用 compose 组合多个返回对象的方法调用。
| 方式 | 适用场景 | 优点 |
|---|---|---|
| 函数组合 | 无状态数据转换 | 逻辑清晰、易测试 |
| 链式调用 | 对象多步操作 | 代码紧凑、流畅 |
小结
掌握 Python 的函数组合与链式调用,能让你写出更优雅的代码。关键在于理解高阶函数返回函数和类方法返回 self 这两个核心点,并在合适场景选用对应模式。