Python 如何将一个函数重复n次

Python 如何将一个函数重复n次,python,higher-order-functions,Python,Higher Order Functions,我试图用python编写一个函数,如下所示: def repeated(f, n): ... 其中,f是一个接受一个参数的函数,n是一个正整数 例如,如果我将正方形定义为: def square(x): return x * x 我打电话 repeated(square, 2)(3) 这将是3,2次平方。像这样的吗 def repeat(f, n): if n==0: return (lambda x: x) return (l

我试图用python编写一个函数,如下所示:

def repeated(f, n):
    ...
其中,
f
是一个接受一个参数的函数,
n
是一个正整数

例如,如果我将正方形定义为:

def square(x):
    return x * x
我打电话

repeated(square, 2)(3)
这将是3,2次平方。

像这样的吗

def repeat(f, n):
     if n==0:
             return (lambda x: x)
     return (lambda x: f (repeat(f, n-1)(x)))
这应该做到:

 def repeated(f, n):
     def rfun(p):
         return reduce(lambda x, _: f(x), xrange(n), p)
     return rfun

 def square(x):
     print "square(%d)" % x
     return x * x

 print repeated(square, 5)(3)
输出:

 square(3)
 square(9)
 square(81)
 square(6561)
 square(43046721)
 1853020188851841
还是小于λ

def repeated(f, n):
    def rfun(p):
        acc = p
        for _ in xrange(n):
            acc = f(acc)
        return acc
    return rfun

我认为您需要函数合成:

def compose(f, x, n):
  if n == 0:
    return x
  return compose(f, f(x), n - 1)

def square(x):
  return pow(x, 2)

y = compose(square, 3, 2)
print y

以下是使用
reduce
的配方:

def power(f, p, myapply = lambda init, g:g(init)):
    ff = (f,)*p # tuple of length p containing only f in each slot
    return lambda x:reduce(myapply, ff, x)

def square(x):
    return x * x

power(square, 2)(3)
#=> 81
我称之为幂函数,因为幂函数就是这样做的,用合成代替乘法

(f,)*p
创建一个长度为
p
的元组,在每个索引中填充
f
。如果您想获得灵感,可以使用生成器生成这样的序列(请参见
itertools
)——但请注意,它必须在lambda内部创建


myapply
在参数列表中定义,因此仅创建一次

使用
reduce
和lamba。 构建一个元组,从参数开始,然后是所有要调用的函数:

>>> path = "/a/b/c/d/e/f"
>>> reduce(lambda val,func: func(val), (path,) + (os.path.dirname,) * 3)
"/a/b/c"

使用reduce和itertools.repeat(如Marcin所建议的):

您可以按如下方式使用它:

>>> repeated(os.path.dirname, 3)('/a/b/c/d/e/f')
'/a/b/c'

>>> repeated(square, 5)(3)
1853020188851841

(分别导入
os
或定义
square
后)

使用名为
repeatfunc
的itertools配方执行此操作

给定的

def square(x):
    """Return the square of a value."""
    return x * x
代码

发件人:

演示

可选:您可以使用第三方库,方便地实现以下配方:

import more_itertools as mit


list(mit.repeatfunc(square, 2, 3))
# [9, 9]

通过
>pip安装more\u itertools

可能会,但我认为它显示了OP想要构造的内容。如果您将检查更改为
n==0
,并返回
lambda x:x
,在这种情况下,您的方法也适用于零。请注意,OP要求的是高阶函数。您已经创建了一个递归函数,该函数重复应用相同的函数。不完全一样。建议
def compose(f,x,n):return functools.reduce(lambda x,u:f(x),range(n),x)
对于大p,显式构造长度为n的元组有缺点。@UweKleine-König是的,这就是为什么5年前我提到使用itertools生成器作为替代。
def repeatfunc(func, times=None, *args):
    """Repeat calls to func with specified arguments.

    Example:  repeatfunc(random.random)
    """
    if times is None:
        return starmap(func, repeat(args))
    return starmap(func, repeat(args, times))
import more_itertools as mit


list(mit.repeatfunc(square, 2, 3))
# [9, 9]