5

私はPythonの関数のプロパティを研究していて、次のことを求める演習に出くわしました。

数値の累乗を返す関数を記述します。条件:関数は1つの引数のみを取ることができ、指定された数値の累乗の値を返すために別の関数を使用する必要があります。

この演習を解決するコードは次のとおりです。

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

たとえば、2 ^ 3のべき乗の値を知りたい場合は、次のように関数を呼び出します。power(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

可能?

4

2 に答える 2

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

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

または、代わりに、lambdaeverの使用をスキップして、ネストされた関数として使用することもできます。

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
于 2013-01-23T16:18:25.627 に答える
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 
于 2013-01-23T16:29:51.410 に答える