让我们说我们有很多这样的函数:
def init(value):
return {'number': value}
def set_type(value):
if isinstance(value['number'], float):
value['type'] = 'float'
else:
value['type'] = 'integer'
return value
def set_is_positive(value):
if value['number'] < 0:
value['is_positive'] = False
else:
value['is_positive'] = True
return value
并撰写如下函数:
def compose(*funcs):
def compose_2_funcs(f1, f2):
return lambda arg: f1(f2(arg))
return reduce(compose_2_funcs, funcs)
每个函数的结果都作为下一个参数传递。例如,composed = compose(f, g, h); result = composed(arg)
与result = f(g(h(arg)))
相同。这允许我们:
description_builder = compose(set_type, set_is_positive, init)
description_builder(5)
# Result: {'number': 5, 'type': 'integer', 'is_positive': True}
这很好,很灵活,我喜欢用它。但有一件事困扰着我。它看起来有点反直觉,功能按相反的顺序指定(特别是那些不知道什么是“功能组合”的人)
所以我可以定义一个这样的函数:
def compose_reversed(*funcs):
def composed(arg):
result = arg
for f in funcs:
result = f(result)
return result
return composed
它更具可读性(恕我直言),并允许在调用函数时指定函数,因此description_builder = compose_reversed(init, set_is_positive, set_type)
。
最后,这是我的问题:)
pipe
,compose_right
(以及compose_left
)。P.S。我相信这个问题适用于任何具有高阶函数的语言,而不仅仅是python。
答案 0 :(得分:0)
所以,似乎我们对此没有更多的意见。
总结一下:
pipe
和compose_right
(以及compose_left
)compose_left
更像是数学中的函数组合,而compose_right
可能被认为更具可读性,因为函数的列出顺序与应用的顺序相同。将此标记为答案,直到有人想要更详细。