2012-07-20 10 views
7

मैं बनाने के लिए times() नाम के एक समारोह चाहते हैं, क्रम में:पायथन में ऐसे कार्यात्मक-प्रोग्रामिंग टूल का निर्माण कैसे करें?

times(func,2) बराबर lambda x:func(func(x))

और times(func,5)lambda x:func(func(func(func(func(x)))))

के बराबर करने के लिए वहाँ पायथन में इस तरह के एक उपकरण है? कोड मुझे कैसा दिखता है अगर मैं इसे खुद लिखना चाहता हूं?

धन्यवाद!

उत्तर

15

मैं इस power() पर कॉल करने का सुझाव दूंगा, क्योंकि यह वास्तव में n फ़ंक्शन की वें शक्ति है। मानक पुस्तकालय में ऐसी कोई बात नहीं है, लेकिन आप आसानी से इसे अपने आप को लागू कर सकते हैं:

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

धन्यवाद, स्वेन। 'लपेटा' समारोह जादू दिखता है। –

+0

अगर मैं कर सकता तो मैं यह +100 दूंगा। कितने शालीन! – inspectorG4dget

+0

मैं बस यह सोच रहा हूं कि ** ** पुनरावर्तक ** ** इसके बजाय ** ऐसा करने के लिए ** रिकर्सिव ** है। –

5

धन्यवाद, स्वेन

मुझे लगता है कि ऐसा करने के लिए एक पुनरावर्ती रास्ता मिल गया है, लेकिन तुम्हारा अधिक 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 

और एक तरह से डेकोरेटर के साथ लागू किया:

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 
संबंधित मुद्दे