繁体   English   中英

python中的反向函数组成(不仅如此)

[英]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)

最后,这是我的问题:)

  1. 这个东西有特殊的名字吗? 在注释中建议: pipecompose_right (以及compose_left )。
  2. 与经典功能组合相比,优缺点是什么?

ps我相信这个问题适用于所有具有高阶函数的语言,而不仅仅是python。

因此,似乎我们对此没有更多意见。

总结一下:

  1. 建议的名称是pipecompose_right (以及compose_left
  2. 这里不多。 看起来像是个人喜好和特殊情况。 compose_left是数学中的函数合成,而compose_right认为更具可读性,因为函数以与应用相同的顺序列出。

将此标记为答案,直到有人想做更详细为止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM