我一直无法理解h(a)(b)
的含义。我昨天之前从未见过其中一个,我不能这样宣布一个函数:
def f (a)(b):
return a(b)
当我尝试def f (a, b):
时,它也无效。这些功能做什么?我该如何申报?最后, f(a, b)
和f(a)(b)
之间有什么区别?
答案 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)
使用两个参数f
和a
来调用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