5

我正在研究 Python 中函数的属性,并且遇到了一个要求:

编写一个返回数字幂的函数。条件:该函数只能接受一个参数,并且必须使用另一个函数来返回给定数字的幂的值。

解决这个练习的代码是:

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

例如,如果我们想知道幂的值:2^3,我们可以这样调用函数:power(3)(2)

这是我想知道的:

有什么方法可以编写一个函数,在调用时具有类似的结构:function()()()。换句话说,是否可以编写一个在调用时需要三个或更多括号 ()()() 的函数?如果可能的话,你能给我一个该函数的示例代码并简要解释一下吗?

还:

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 函数,其工作方式类似于lambda x: lambda y: 2 * y ** x(即,与您的原始函数一样,只是多了一个“乘以 2”)。

您可以根据需要将任意数量的 s 堆叠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 回答