我正在研究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
可能的?
答案 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