【问题标题】:how do I apply a function n times? [closed]如何应用函数 n 次? [关闭]
【发布时间】:2015-02-01 05:59:06
【问题描述】:

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

def integer(x):

      x + 1

所以我会重复 (integer, 5) 并且我会拥有 integer(integer(integer(integer(integer(x))

【问题讨论】:

  • 如果您想了解更多关于高阶函数、函数组合和一般柯里化的知识,那么我建议您看看functools 模块。它有很多好东西:)
  • 我在扩展任何提议的解决方案以处理多个函数参数时遇到了问题。在传递 3-tupel 而不是 3 个参数后,它起作用了: def _f(_t): return (_t[0]**2+_t[1])%_t[2] def _repeat(_func, _m, _t): for _i在范围内(_m):_t =(_func(_t),_t[1],_t[2])返回_t[0] S = 894488611079900130 A = 1 N =(2**31-1)**2打印( _repeat(_f, 27081, (2, A, N)) == S)

标签: python higher-order-functions


【解决方案1】:

您可以使用简单的 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
>>>

【讨论】:

  • increments 的函数名称 integer 相当混乱。即使 OP 使用了它。
  • @GamesBrainiac,是的,同意。编辑了答案。
  • hi5 兄弟! :) 继续努力。
【解决方案2】:

嗯,有迭代方法:

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

结果完全相同,但可能会稍微快一些。

【讨论】:

  • 通常不鼓励用 eval 做这样的事情吗?或者这不是安全问题,因为没有从其他地方向 eval 引入字符串?
【解决方案3】:

我们也有递归实现:

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

【讨论】:

  • 这会导致n = 0 出现最大回收错误。也许解决这个问题的一个好方法是添加一个案例if n == 0: return lambda x: x。
【解决方案4】:

你可以创建一个装饰器,

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)

【讨论】:

    猜你喜欢
    • 2015-12-12
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 2019-03-28
    • 1970-01-01
    • 2017-04-30
    • 2020-08-25
    • 1970-01-01
    相关资源
    最近更新 更多