Python functions with multiple parameter brackets
我一直很难理解
1 2 | def f (a)(b): return a(b) |
当我试着做
具有多个参数括号的函数不存在,正如您在试图定义参数括号时看到的那样。但是,有一些函数返回(其他)函数:
1 2 3 4 | def func(a): def func2(b): return a + b return 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 |
这是定义接受参数的装饰器时非常常见的习惯用法。
注意,调用
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) andf(a)(b) ?
号
现在应该很清楚,您知道
f(a, b) 用两个参数a 和b 调用f 。f(a)(b) 用一个参数a 调用f ,然后返回另一个函数,然后用一个参数b 调用该函数。
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) |
然后,
1 2 3 4 | def f(a): def g(b): return a * b return g |
。
然后
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 |
。