Python函数具有多个参数括号

C. *_*ard 30 python function

我一直无法理解是什么h(a)(b)意思.我昨天之前从未见过其中一个,我不能这样声明一个函数:

def f (a)(b):
    return a(b)
Run Code Online (Sandbox Code Playgroud)

当我试图这样做时def f (a, b):,它也没有用.这些功能什么作用?我该如何申报?最后,和之间的区别是什么?f(a, b)f(a)(b)

Mar*_*nen 65

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

def func(a):
    def func2(b):
        return a + b
    return func2
Run Code Online (Sandbox Code Playgroud)

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

>>> func2 = func(1)  # You don't have to call it func2 here
>>> func2(2)
3
Run Code Online (Sandbox Code Playgroud)

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

>>> func(1)(2)   # func(1) returns func2 which is then called with (2)
3
Run Code Online (Sandbox Code Playgroud)

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


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

>>> f1 = func(1)
>>> f2 = func(1)
>>> f1(1), f2(1)
(2, 2)
>>> f1 is f2
False
Run Code Online (Sandbox Code Playgroud)

最后,和之间的区别是什么?f(a, b)f(a)(b)

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

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


che*_*ner 16

f(a)(b)只是意味着表达式f(a)返回一个本身可调用的值.这是一个简短的形式

g = f(a)
g(b)
Run Code Online (Sandbox Code Playgroud)

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

(f(a))(b)  # f(a) is evaluated first, then the result is applied to b
Run Code Online (Sandbox Code Playgroud)

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

d1[x][y]
Run Code Online (Sandbox Code Playgroud)

相当于

d2 = d1[x]
d2[y]
Run Code Online (Sandbox Code Playgroud)


kek*_*coh 5

让我们说我们有一个表达式

f(a)(b)
Run Code Online (Sandbox Code Playgroud)

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

def f(a):
   def g(b):
      return a * b
   return g
Run Code Online (Sandbox Code Playgroud)

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

def g(b):
   return 5 * b
Run Code Online (Sandbox Code Playgroud)

人们现在可以这样做了

mult_by_5 = f(5)
[mult_by_5(x) for x in range(10)]
Run Code Online (Sandbox Code Playgroud)

让我们看中,更多嵌套函数怎么样?:

def f(a):
  def g(b):
    def h(c):
      return a * b *c
    return h
  return g
f(2)(3)(4) # 24
Run Code Online (Sandbox Code Playgroud)