【问题标题】:What does the parenthesis after the function mean函数后面的括号是什么意思
【发布时间】:2018-10-14 16:19:43
【问题描述】:

我被要求在 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 怎么知道,在自身内部获取该值并使用它?

【问题讨论】:

标签: python python-3.x function


【解决方案1】:

这意味着你的函数应该返回一个函数:

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

【讨论】:

  • 啊,现在我明白了,它返回一个没有括号的函数,然后使用第二个括号作为输入。非常感谢
【解决方案2】:

函数是 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=[],相同的列表可能会以一种不可预见的方式被重复使用。

【讨论】:

  • 对这种方法要非常非常小心。使用 partial 时,可变默认参数 gotcha 仍然有效。
  • @DeepSpace,同意,我会添加免责声明:)
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-04-18
    • 1970-01-01
    • 2018-01-05
    • 2012-11-16
    • 2013-05-28
    相关资源
    最近更新 更多