[英]Reversed function composition in python(not only)
可以说我们有很多这样的函数:
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)
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
它甚至更具可读性(IMHO),并且允许按调用顺序指定函数,因此description_builder = compose_reversed(init, set_is_positive, set_type)
。
最后,这是我的问题:)
pipe
, compose_right
(以及compose_left
)。 ps我相信这个问题适用于所有具有高阶函数的语言,而不仅仅是python。
因此,似乎我们对此没有更多意见。
总结一下:
pipe
和compose_right
(以及compose_left
) compose_left
是数学中的函数合成,而compose_right
认为更具可读性,因为函数以与应用相同的顺序列出。 将此标记为答案,直到有人想做更详细为止。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.