如何 return 来自高阶函数的值?

How do I return a value from a higher-order function?

伙计们,我怎样才能调用 make_repeater(square, 0)(5) return 5 而不是 25?我猜我需要更改行 "function_successor = h" 因为那时我只是得到 square(5) 但不确定我需要将其更改为...

square = lambda x: x * x

def compose1(h, g):
    """Return a function f, such that f(x) = h(g(x))."""
    def f(x):
        return h(g(x))
    return f

def make_repeater(h, n):
    iterations = 1
    function_successor = h
    while iterations < n:  
        function_successor = compose1(h, function_successor)
        iterations += 1
    return function_successor

它需要满足一系列其他要求,例如:

make_repeater(平方, 2)(5) = 平方(平方(5)) = 625

make_repeater(方形, 4)(5) = 方形(方形(方形(方形(5)))) = 152587890625

为此,您必须使用身份函数 (f(x) = x) 作为 function_successor 的初始值:

def compose1(h, g):
    """Return a function f, such that f(x) = h(g(x))."""
    def f(x):
        return h(g(x))
    return f


IDENTITY_FUNCTION = lambda x: x

def make_repeater(function, n):
    function_successor = IDENTITY_FUNCTION

    # simplified loop
    for i in range(n):
        function_successor = compose1(function, function_successor)

    return function_successor


if __name__ == "__main__":    
    square = lambda x: x * x
    print(make_repeater(square, 0)(5))
    print(make_repeater(square, 2)(5))
    print(make_repeater(square, 4)(5))

输出为

5
625
152587890625

虽然恒等函数(不做任何有用的事情)始终是组合函数的一部分,但对于性能而言,这并不是最优的,因此优化版本如下所示:

def make_repeater(function, n):
    if n <= 0:
        return IDENTITY_FUNCTION

    function_successor = function
    for i in range(n - 1):
        function_successor = compose1(function, function_successor)

    return function_successor