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

Python 使用3个或更多参数输入字段调用函数-Function()(),python,function,Python,Function,我正在研究Python中函数的属性,我遇到了一个练习,要求: 写一个函数,返回一个数的幂。条件:函数只能接受1个参数,并且必须使用另一个函数返回给定数字的幂的值 解决此练习的代码是: 例如,如果我们想知道幂的值:2^3,我们可以这样调用函数:幂(3)(2) 以下是我想知道的: 有没有办法编写一个调用时具有类似结构的函数:function()。 换句话说,是否可以编写一个调用时需要三个或更多括号()的函数? 如果可能的话,你能给我一个该函数的示例代码并简要解释一下吗 此外: 可能吗?当然可以: d

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

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

解决此练习的代码是:

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

以下是我想知道的:

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

此外:

可能吗?

当然可以:

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\u times(2)
)调用此函数时,它将返回一个lambda函数,其工作方式类似于
lambda x:lambda y:2*y**x
(即,与原始函数类似,仅使用额外的“times 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

@David的回答将恰当地回答您关于固定嵌套函数调用的问题。对于未定义的嵌套,您可能需要定义一个类并重载
\uuuuu call\uuuuuu
方法以及
\uuuu repr\uuuu
\uuu int\uuuu
,以满足您的需要

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

有没有可能在顶级函数中嵌套两个函数,并提供具有以下结构的参数:function()(,)或其他任何方式?@JoãoCastro:您不需要嵌套两个函数来实现这一点,只需将函数体更改为
return lambda x,y:k*y**x
,它将作为
幂次(2)(3,4)
(返回
2*4^3
)。或者我没有领会你的意思?我的意思是好像我有两个函数,函数中有名字(而不是lambdas)^^如果将这两个参数都提供给顶级函数,为什么要将其作为两个嵌套函数?(如果你愿意,你可以在你的原始问题中编辑一个你正在寻找的例子)。作为你的参考,这被称为currying。
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
>>> 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