7

私はPythonで次のような関数を書き込もうとしています:

def repeated(f, n):
    ...

ここfで、は1つの引数を取りn、正の整数である関数です。

たとえば、正方形を次のように定義した場合:

def square(x):
    return x * x

そして私は電話しました

repeated(square, 2)(3)

これは3、2回二乗します。

4

7 に答える 7

25

それはそれを行う必要があります:

 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

または-lambda少ない?

def repeated(f, n):
    def rfun(p):
        acc = p
        for _ in xrange(n):
            acc = f(acc)
        return acc
    return rfun
于 2011-09-09T09:59:01.923 に答える
9

reduceとランバを使用。パラメータで始まり、呼び出したいすべての関数が続くタプルを作成します。

>>> path = "/a/b/c/d/e/f"
>>> reduce(lambda val,func: func(val), (path,) + (os.path.dirname,) * 3)
"/a/b/c"
于 2014-03-27T17:08:05.853 に答える
3

このようなもの?

def repeat(f, n):
     if n==0:
             return (lambda x: x)
     return (lambda x: f (repeat(f, n-1)(x)))
于 2011-09-09T09:55:37.143 に答える
1

reduce と itertools.repeat を使用する (Marcin が提案したように):

from itertools import repeat
from functools import reduce # necessary for python3

def repeated(func, n):
    def apply(x, f):
        return f(x)
    def ret(x):
        return reduce(apply, repeat(func, n), x)
    return ret

次のように使用できます。

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

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

(それぞれインポートosまたは定義した後square)

于 2014-05-21T22:36:17.337 に答える
0

を使用したレシピは次の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

私はこれを と呼んでいますpower。なぜなら、これは文字どおり累乗関数が行うことであり、合成が乗算に取って代わるからです。

(f,)*pすべてのインデックスでp満たされた長さのタプルを作成します。f工夫を凝らしたい場合は、ジェネレーターを使用してそのようなシーケンスを生成します (「参考文献」を参照itertools)。ただし、ラムダ内で作成する必要があることに注意してください。

myapply一度だけ作成されるように、パラメーター リストで定義されます。

于 2012-09-15T03:43:45.017 に答える
0

関数合成が必要だと思います:

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
于 2011-09-09T10:03:17.687 に答える