Python 如何应用函数n次?

Python 如何应用函数n次?,python,higher-order-functions,Python,Higher Order Functions,我一直在尝试实现一个更高阶的函数,但没有成功 重复(f,n),其中f是另一个函数,n是整数值,表示n将应用于变量x的次数。 例如: def integer(x): x + 1 所以我要重复(整数,5)和整数(整数)(整数)(整数)(整数)(整数)(x)好的,这里有一个迭代方法: def repeat(f, n): def new_fn(x): for _ in range(n): x = f(x) return x

我一直在尝试实现一个更高阶的函数,但没有成功 重复(f,n),其中f是另一个函数,n是整数值,表示n将应用于变量x的次数。 例如:

def integer(x):

      x + 1

所以我要重复(整数,5)和整数(整数)(整数)(整数)(整数)(整数)(x)

好的,这里有一个迭代方法:

def repeat(f, n):
    def new_fn(x):
        for _ in range(n):
            x = f(x)
        return x
    return new_fn

higher_fn = repeat(lambda x: x+3, 5)

higher_fn(2)    # => 17 == (((((2 + 3) + 3) + 3) + 3) + 3)
def repeat(f, n):
    new_fn_str = "lambda x: {}x{}".format("f(" * n, ")" * n)
    new_fn     = eval(new_fn_str, {"f": f})
    return new_fn
以及组合方法:

def repeat(f, n):
    def new_fn(x):
        for _ in range(n):
            x = f(x)
        return x
    return new_fn

higher_fn = repeat(lambda x: x+3, 5)

higher_fn(2)    # => 17 == (((((2 + 3) + 3) + 3) + 3) + 3)
def repeat(f, n):
    new_fn_str = "lambda x: {}x{}".format("f(" * n, ")" * n)
    new_fn     = eval(new_fn_str, {"f": f})
    return new_fn

结果完全相同,但速度可能稍快。

您可以使用一个简单的for循环

>>> def integer_inc(x):
...     return x + 1
... 
>>> def repeat(func, n, x):
...     for i in range(n):
...         x = func(x)
...     return x
... 
>>> repeat(integer_inc, 5, 1)
6
>>>

你可以创建一个装饰器

from functools import wraps


def repeat(n=1):
    def decorator(func):
        @wraps(func)
        def wrapper(args):
            args = func(args)
            for i in xrange(n-1):
                args = func(args)
            return args
        return wrapper
    return decorator

if __name__ == "__main__":
    @repeat(n=6)
    def test(a):
        print a
        return a+1
    test(1)

我们还有递归实现:

def repeat(f, n):
    if n == 1:
        return f
    else:
        return lambda x: f(repeat(f,n-1)(x))

如果您想了解更多关于高阶函数、函数组合和一般的咖喱制作的知识,那么我建议您看看
functools
模块。它有很多优点:)递增函数的名称
integer
相当令人困惑。即使OP使用了它。@GamesBrainiac,同意。编辑了答案。hi5 bratha!:)继续努力。这会导致
n=0
的最大递归错误。如果n==0:返回lambda x:x,可能是解决这个问题的一个好方法。