2012-07-20 4 views

Odpowiedz

15

Proponuję zadzwonić pod numer power(), ponieważ jest to w rzeczywistości n th moc funkcji. Nie ma czegoś takiego w bibliotece standardowej, ale można łatwo wdrożyć go samodzielnie:

def power(f, n): 
    def wrapped(x): 
     for i in range(n): 
      x = f(x) 
     return x 
    return wrapped 
+0

Dzięki Sven. Funkcja '' wrapped'' wygląda magicznie. –

+0

Dałbym ten +100, gdybym mógł. Taki elegancki! – inspectorG4dget

+0

Zastanawiam się, czy istnieje ** rekurencyjny ** zamiast ** iteratywny ** sposób, aby to zrobić .. –

5

Dzięki Sven

znalazłem rekurencyjny sposób to zrobić, ale twój wygląda bardziej pythonic:

def power(func, n): 
    def lazy(x, i=n): 
     return func(lazy(x, i-1)) if i > 0 else x 
    return lazy  

>>> power(lambda x:x*2,3)(9) 
72 
>>> power(lambda x:x*2,2)(9) 
36 
>>> power(lambda x:x*2,1)(9) 
18 
>>> power(lambda x:x*2,0)(9) 
9 

i sposób realizowany z dekoratora:

def powerize(n): 
    def wrapped(func): 
     def newfunc(*args): 
      return power(func,n)(*args) 
     return newfunc 
    return wrapped 

@powerize(3) 
def double_3(x): 
    return x*2 

>>> double_3(8) 
64