我被要求在Python 3中编写一个函数:
编写一个名为general_poly
的函数,例如,将general_poly([1, 2, 3, 4])(10)
评估为1234
,因为1*10^3 + 2*10^2 + 3*10^1 + 4*10^0
。
现在我不明白第二个括号(10)
是什么意思。
我的函数general_poly
如何知道,将该值置于其中并使用它?
答案 0 :(得分:10)
这意味着你的函数应该返回一个函数:
def multiplier(times):
def inner(num):
return num * times
return inner
result = multiplier(2)(3)
print(result)
# 6
times_four = multiplier(4)
print(times_four(3))
# 12
这可能是也可能不是一种矫枉过正,但如果您需要保存状态,您甚至可以使用课程并实施__call__
:
class multiplier:
def __init__(self, times):
self.times = times
def __call__(self, num):
return num * self.times
print(multiplier(2)(3))
# 6
答案 1 :(得分:1)
函数是Python中的first-class object。其中一个推论是函数可能返回另一个函数。
您的具体示例可以写成如下:
def general_poly(A):
k = len(A)
def power(n):
return sum(j*n**(k-i) for i, j in enumerate(A, 1))
return power
res = general_poly([1, 2, 3, 4])(10) # 1234
外部函数general_poly
返回内部函数power
。前者采用列表或数组,而后者采用标量。
构建逻辑的另一种方法是使用functools.partial
。这创建了一个新函数,其中一个或多个参数被修复并且不需要内部函数。
from functools import partial
def general_poly(A, n):
k = len(A)
return sum(j*10**(k-i) for i, j in enumerate(A, 1))
genral_poly_10 = partial(general_poly, n=10)
res = genral_poly_10([1, 2, 3, 4]) # 1234
当然,这仅在您希望为特定功率创建功能时才有用;简而言之,n
可以直接用作没有functools.partial
的附加参数。
注意:Beware of mutable default arguments。因此,如果您的函数具有可变的默认参数,例如在上面的示例中设置A=[]
,可能会以不可预见的方式重复使用相同的列表。
答案 2 :(得分:0)
第二组paranthesis实际上并不与函数交互,它们适用于函数返回的任何内容。它与returnsAList()[0]
的原理相同,它会为您提供returnsAList()
返回的列表的第一个元素。