2013-01-23 78 views
5

我學習的函數的性質在Python和我對面,詢問到的練習來:功能調用帶有3個或更多參數輸入字段 - 功能()()()

寫返回德功率的函數的數字。條件:該函數只能使用1個參數,並且必須使用另一個函數來返回給定數字的冪值。

,解決了這個練習的代碼是:

def power(x): 
    return lambda y: y**x 

例如,如果我們想知道的功率值:2^3,我們叫這樣的功能:電源( 3)(2)

這裏是我想知道:

有什麼辦法編寫一個函數,調用它時,也有類似的結構:函數()()()。 換句話說,是否可以編寫一個函數,當被調用時需要三個或更多括號()()()? 如果可能,請給我一個該函數的示例代碼並簡要解釋它?

另外:

def power(x): 
    def power_extra(y): 
     return y 

    def power_another(z): 
     return z 

    return power_extra and power_another 

可能嗎?

+0

爲了您的信息,這稱爲咖喱。 – rlms

回答

4

當然,你可以:

def power_times(k): 
    """use as power_times(k)(x)(y) => k * y^x""" 
    return lambda x: lambda y: k * y**x 

print power_times(2)(3)(4) # returns 2 * 4^3 = 128 

當你調用與參數2(power_times(2))這個函數,它返回一個lambda函數,像lambda x: lambda y: 2 * y ** x工作(也就是像你原來的功能,只能用一個額外的「次2「)。

只要你喜歡你可以彼此疊放許多lambda S:

def many_lambdas(x): 
    """many_lambdas(x)(y)(z)(q) => x + y * z^q""" 
    return lambda y: lambda z: lambda q: x + y * z ** q 

print many_lambdas(1)(2)(3)(4) # prints 163 

事實上,如果你跳過使用def可言的,只是寫它可能是更清楚:

many_lambdas = lambda x: lambda y: lambda z: lambda q: x + y * z ** q 

,或者,你可以跳過使用lambda以往,只是將它們作爲嵌套函數:

def many_funcs(x): 
    def many_funcs_y(y): 
     def many_funcs_z(z): 
      def many_funcs_q(q): 
       return x + y * z ** q 
      return many_funcs_q 
     return many_funcs_z 
    return many_funcs_y 

print many_funcs(1)(2)(3)(4) # prints 163 
+0

是否有可能在頂層函數內部嵌套兩個函數併爲結構提供參數:function()(<嵌套函數1>的參數,<嵌套函數2的參數>) 或以任何其他方式? – Testing360

+0

@JoãoCastro:你不需要嵌套兩個函數來做到這一點,你可以將函數的主體改爲'return lambda x,y:k * y ** x',它可以像'power_times(2 )(3,4)'(返回'2 * 4^3')。或者我錯過了你的觀點? –

+0

我的意思是如果我有兩個函數名稱(而不是lambdas)函數內的函數。 ^^ – Testing360

3

@David的答案會恰當地回答你對固定嵌套函數調用的問題。對於未定義的嵌套,您可能需要定義一個類並將__call__方法與__repr____int__一起超載以滿足您的目的。

>>> class Power(object): 
    def __init__(self, value): 
     self.value = value 
    def __call__(self, value): 
     self.value **= value 
     return self 
    def __int__(self): 
     return self.value 
    def __repr__(self): 
     return str(self.value) 


>>> print Power(2)(2)(2)(2)(2) 
65536 
>>> int(Power(2)(2)(2)(2)(2))/2 
32768 
+0

+1。那很可愛。 – kindall