2013-01-23 22 views
5

私は、Pythonの関数の性質を研究していると私はに尋ね運動に出くわした:機能 - 機能()()()

はデパワーを返す関数を書きます数字の条件:関数は引数を1つしか取らず、与えられた数のべき乗の値を返すために別の関数を使用しなければならない。

この演習を解決したコードは次のとおりです。たとえば

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

、我々は電力の値お知りになりたい場合は:2^3を、私たちはこのような関数を呼び出します。パワーを( 3)(2)ここで

は、私が知りたいのですが何である:

と呼ばれる、関数を記述する方法はあります、類似した構造を持っています。function()()()。 つまり、呼び出されたときに3つ以上のかっこ()()()を必要とする関数を記述することは可能ですか? 可能であれば、その関数のサンプルコードを与えて簡単に説明できますか?また

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 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

トップレベル関数内にネストされた2つの関数を持ち、構造体に引数を指定することは可能ですか?function()(ネストされた関数1>、<ネスト関数2の引数>) またはその他の方法? – Testing360

+0

@JoãoCastro:これを行うには2つの関数をネストする必要はありません。関数の本体を 'return lambda x、y:k * y ** x'に変更するだけで、' power_times(2) )(3,4) '(' 2 * 4^3'を返す)。それとも私はあなたのポイントを逃したのですか? –

+0

私はあたかも関数内に名前のついた2つの関数(lambdaの代わりに)があるかのように意味していました。 ^^ – Testing360

3

@ Davidの回答は、固定ネストされた関数呼び出しの場合にはあなたの質問に答えてくれます。定義されていないネストの場合は、クラスを定義し、__repr____int__のメソッドを__call__メソッドにオーバーロードして、目的に合ったものにすることができます。

>>> 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