函数后面的括号是什么意思?

7
我被要求写一个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 怎样才能知道要将该值作为参数并使用它呢?

5
这意味着该函数将返回一个函数,并使用10作为参数调用返回的函数。因此,您的general_poly函数应该返回一个函数,并以10作为基础使用。 - Josef Prochazka
3个回答

11
这意味着您的函数应该返回一个函数:
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

啊,现在我明白了,它返回一个没有括号的函数,然后使用第二个括号作为输入。非常感谢。 - ccasimiro9444

2
在Python中,函数是一种一等对象。由此得出的一个推论是,函数可以返回另一个函数。
你的特定示例可以写成以下形式:
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
注意:小心可变默认参数。因此,如果您的函数有一个可变的默认参数,例如在上面的示例中设置A=[],则同一列表可能会以意想不到的方式被重复使用。

使用这种方法时一定要非常小心。即使使用“partial”函数,可变默认参数的陷阱仍然存在。 - DeepSpace
@DeepSpace,同意,我会添加免责声明 :) - jpp

1
第二组括号实际上不与函数交互,它们适用于函数返回的任何内容。这与returnsAList()[0]的原理相同,它将为您提供由returnsAList()返回的列表的第一个元素。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接