Python函数具有多个参数括号

时间:2017-03-18 13:10:43

标签: python function

我一直无法理解h(a)(b)的含义。我昨天之前从未见过其中一个,我不能这样宣布一个函数:

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

当我尝试def f (a, b):时,它也无效。这些功能做什么?我该如何申报?最后, f(a, b)f(a)(b)之间有什么区别

3 个答案:

答案 0 :(得分:62)

当您尝试定义具有多个参数括号的函数时,不存在这些函数。但是,还有返回(其他)函数的函数:

def func(a):
    def func2(b):
        return a + b
    return func2

现在,当您致电func()时,它会返回内部func2功能:

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

但是如果你以后不需要内部函数,则不需要将它保存到变量中,你可以一个接一个地调用它们:

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

在定义带参数的装饰器时,这是一个非常常见的习惯用法。

请注意,调用func()始终会创建一个 new 内部函数,即使它们在func2的定义中都被命名为func:< / p>

>>> f1 = func(1)
>>> f2 = func(1)
>>> f1(1), f2(1)
(2, 2)
>>> f1 is f2
False
  

最后, f(a, b)f(a)(b)之间有什么区别

现在应该清楚,你知道f(a)(b)做了什么,但总结一下:

  • f(a, b)使用两个参数fa来调用b
  • f(a)(b)使用一个参数f调用a,然后返回另一个函数,然后使用一个参数调用b

答案 1 :(得分:15)

f(a)(b)只表示表达式f(a)返回一个本身可调用的值。

的简短形式
g = f(a)
g(b)

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

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

它与用于索引嵌套字典的方括号的相同加倍完全类似。

d1[x][y]

相当于

d2 = d1[x]
d2[y]

答案 2 :(得分:5)

假设我们有一个像

这样的表达式
f(a)(b)

然后,f(a)返回一个函数本身,该函数将使用参数b调用。请考虑以下示例

def f(a):
   def g(b):
      return a * b
   return g

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

def g(b):
   return 5 * b

现在可以做这样的事情了

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

让我们看中,更多嵌套函数呢?:

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