Python函数具有多个参数括号

Python functions with multiple parameter brackets

我一直很难理解h(a)(b)的意思。在昨天之前,我从未见过这样的函数,而且我不能这样声明函数:

1
2
def f (a)(b):
    return a(b)

当我试着做def f (a, b):的时候,它也不起作用。这些功能是做什么的?我怎么申报?最后,f(a, b)f(a)(b)有什么区别?


具有多个参数括号的函数不存在,正如您在试图定义参数括号时看到的那样。但是,有一些函数返回(其他)函数:

1
2
3
4
def func(a):
    def func2(b):
        return a + b
    return func2

现在,当您调用func()时,它返回内部func2函数:

1
2
3
>>> func2 = func(1)  # You don't have to call it func2 here
>>> func2(2)
3

但是,如果以后不需要内部函数,那么就不需要将其保存到变量中,您可以逐个调用它们:

1
2
>>> func(1)(2)   # func(1) returns func2 which is then called with (2)
3

这是定义接受参数的装饰器时非常常见的习惯用法。

注意,调用func()总是会创建一个新的内部函数,即使它们在我们的func的定义中都被命名为func2

1
2
3
4
5
6
>>> f1 = func(1)
>>> f2 = func(1)
>>> f1(1), f2(1)
(2, 2)
>>> f1 is f2
False

And, finally, what's the difference between f(a, b)and f(a)(b)?

现在应该很清楚,您知道f(a)(b)的作用,但要总结一下:

  • f(a, b)用两个参数ab调用f
  • f(a)(b)用一个参数a调用f,然后返回另一个函数,然后用一个参数b调用该函数。


f(a)(b)只是表示表达式f(a)返回一个本身可以调用的值。这是一个简短的形式

1
2
g = f(a)
g(b)

您可能更愿意添加一对多余的括号来强调这不是一个单一的句法结构。

1
(f(a))(b)  # f(a) is evaluated first, then the result is applied to b

它完全类似于为嵌套字典编制索引时使用的方括号加倍。

1
d1[x][y]

等于

1
2
d2 = d1[x]
d2[y]


假设我们有这样的表达

1
f(a)(b)

然后,f(a)返回一个函数本身,该函数通过参数b被调用。考虑下面的例子

1
2
3
4
def f(a):
   def g(b):
      return a * b
   return g

然后f(5)(4)计算为5 * 4,因为f(5)返回的函数基本上是

1
2
def g(b):
   return 5 * b

现在可以做这样的事了

1
2
mult_by_5 = f(5)
[mult_by_5(x) for x in range(10)]

让我们想象一下,更多的嵌套函数呢?:

1
2
3
4
5
6
7
def f(a):
  def g(b):
    def h(c):
      return a * b *c
    return h
  return g
f(2)(3)(4) # 24