我一直无法理解是什么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两个参数a和bf(a)(b)f使用一个参数调用a,然后返回另一个函数,然后使用一个参数调用该函数bche*_*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)
让我们说我们有一个表达式
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)
| 归档时间: |
|
| 查看次数: |
6133 次 |
| 最近记录: |