【问题标题】:a function composition VS a function that acts on another function函数组合 VS 作用于另一个函数的函数
【发布时间】:2012-01-25 16:44:51
【问题描述】:

我有许多可重用的函数,它们都具有相同的签名(它们采用 record 并返回 float)。我经常需要将函数组合成一个新函数。

假设我想创建一个接受record 的函数,将f 应用于它,如果结果为负,则将其转换为零。我有两种方法:组合和功能修改。每种方法的优缺点是什么?

组成:

def non_negative(value):
    return max(0, value)

g = compose(non_negative, f)

# from functional module by Collin Winter
def compose(func_1, func_2, unpack=False):
    """
    compose(func_1, func_2, unpack=False) -> function

    The function returned by compose is a composition of func_1 and func_2.
    That is, compose(func_1, func_2)(5) == func_1(func_2(5))
    """
    if not callable(func_1):
        raise TypeError("First argument to compose must be callable")
    if not callable(func_2):
        raise TypeError("Second argument to compose must be callable")

    if unpack:
        def composition(*args, **kwargs):
            return func_1(*func_2(*args, **kwargs))
    else:
        def composition(*args, **kwargs):
            return func_1(func_2(*args, **kwargs))
    return composition

修改:

def non_negative(func):
    def new_func(record):
        return max(0, func(record))
    return new_func

g = non_negative(f)    

【问题讨论】:

  • 您所做的是专门针对 non_negative 撰写。
  • @DanD。 Thx .. 我不熟悉函数式编程,所以我没有意识到有一个术语。你能给我介绍一些讨论这个问题的介绍性材料吗?
  • 函数特化是函数的一个或多个参数的partial evaluation。它可以使用默认情况下是该术语所暗示的程序来完成,但也可以像您一样手动完成。第二个示例中的代码non_negative 是针对第一个代码示例中的non_negative 函数的compose 的专用版本。
  • 严格来说,您的修改示例不起作用,因为您不返回 new_func,所以 g 最终成为 None
  • @Ben:糟糕,已修复。 @DanD 我明白了。似乎这种专业化会限制non-negative 的可重用性,因为它仅限于一个签名。

标签: python functional-programming python-3.x function-composition


【解决方案1】:

假设 compose 在库中可用,那么我更喜欢此示例的样式。

主要原因是它将一个值限制为非负值以及将一个函数的结果提供给另一个函数的关注点分开了。在“修改”风格中,如果您发现自己想要在一个值而不是函数的结果上运行non_negative,您最终会遇到像non_negative(lambda x: x)(value) 这样的扭曲。您需要为您可能想要组合的每个事物函数编写一个单独的函数,其中每个函数都包含与该函数的代码混合的组合逻辑。

在这个例子中,无论你怎么做,负担都是微不足道的。但一般来说,如果制作独立的小片段如此容易,然后将它们粘合在一起形成复合代码,那么这就是这样做的好方法。

【讨论】:

    【解决方案2】:

    您的两个示例完全一样,只是在一种情况下您使用无点样式,而在另一种情况下您不使用。

    唯一的考虑是您(以及阅读您的代码的人)认为哪个最易读。在某些情况下,我发现无点风格最自然;这是其中一种情况。

    【讨论】:

    • 我不知道“无点”是什么意思。但当然,SO 有答案:stackoverflow.com/questions/944446/…
    • 我能问你为什么在这种情况下你觉得无点风格更自然吗?它确实需要更多的输入......
    • @max: 假设 compose 是一个库函数,它需要的会少很多。
    • compose 是一个库函数;但我正在比较 non_negative(f)compose(non_negative, f)
    • @max:是的,但装饰风格更难理解。
    猜你喜欢
    • 2019-09-02
    • 2015-12-24
    • 2022-01-11
    • 2016-04-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    相关资源
    最近更新 更多