函数调用3个或更多参数输入字段 - function()()()

时间:2013-01-23 16:14:54

标签: python function

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

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

解决此练习的代码是:

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

可能的?

2 个答案:

答案 0 :(得分: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类似的lambda函数(即,与原始函数类似,仅使用额外的“时间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

或者,或者,您可以跳过使用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

答案 1 :(得分: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