我一直很难理解h(a)(b)的意思。在昨天之前,我从未见过这样的函数,而且我不能这样声明函数:
def f (a)(b):
return a(b)
当我试着做def f (a, b):的时候,它也不起作用。这些功能是做什么的?我怎么申报?最后,f(a, b)和f(a)(b)有什么区别?
具有多个参数括号的函数不存在,正如您在试图定义参数括号时看到的那样。但是,有一些函数返回(其他)函数:
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()总是会创建一个新的内部函数,即使它们在我们的func的定义中都被命名为func2:
>>> 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)用两个参数a和b调用f。
f(a)(b)用一个参数a调用f,然后返回另一个函数,然后用一个参数b调用该函数。
如果我们在func中有两个函数,那么我们应该使用第二个参数作为访问它们的索引?
@我不确定我是否完全理解你的问题,你能澄清一点吗?
在您的示例中,您只定义了一个func2函数,您可以用另一个函数(如func3以及如何访问它)来解释,这两个函数都在func定义中。
如果我理解正确的话,你在想这样的事情?如果是这样,那么最好只使用函数列表或函数映射(dict of functions)@arman
@Arman你应该这样做:)pastebin.com/7kfxsdmk
@Arman是的,你可以,但是通常,如果你只需要这些,你可以列出一个函数def f(): return 'foo'; def g(); return 'bar'; list_of_functions = [f, g],然后像这样使用:list_of_functions[1]()。但是,可以使用一个函数来做同样的事情:def function_selector(index): if index == 0: return f; if index == 1; return g等等。但通常,使用函数返回函数方法的目的是因为您需要执行比将索引/键映射到函数更复杂的逻辑。
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]
号
假设我们有这样的表达
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
。