我正在阅读functional programming - Can you explain closures (as they relate to Python)? - Stack Overflow,在这个回答中有以下代码。
def make_counter():
i = 0
def counter(): # counter() is a closure
nonlocal i
i += 1
return i
return counter
c1 = make_counter()
c2 = make_counter()
print (c1(), c1(), c2(), c2())
# -> 1 2 1 2
我的疑问:ta 说 counter() is a closure ,应该是 counter is a closure ,对吧?
来自NeetCode Discord server一个成员的回答:
Yes they're different within a block of code. counter is a reference to a function. counter() is a call to a function named counter.
Within comments () is usually used to indicate that the keyword/namespace is a function in my experience.
For example counter() in text/comment/a book says "Function counter..."
1
Tyanboot 2023-01-26 02:59:23 +08:00
这里的注释里面的 counter() 应该是表达“counter 函数”的意思,而不是表达“counter 函数调用后返回的那个东西”的意思。
加了个括号在后面只是为了表达类型,而不是真的在调用,正常来说不应该会有歧义的吧。 |
2
gowl 2023-01-26 03:02:59 +08:00
他想表达的是 counter 这个函数是 closure ,但是他用了 counter() 这种「调用」形式,不如你理解的 counter 这种「函数值」形式更准确。
|
3
gowl 2023-01-26 03:09:17 +08:00
如果用 ML 家族的语言来表述,可以说:counter 这个类型为 (unit -> int) 的值是一个 closure 。这样就没有歧义了。
|
4
JasonLaw OP @Tyanboot #1 counter()和 counter 它们两个完全是不同的东西,counter 才是一个 function 。
|
5
yulon 2023-01-26 11:37:16 +08:00 1
照你的逻辑,那么 def counter() 也是有语病的,你应该发明一个 def function counter 。
实际上 def 里面的括号是用来装形参而不是实参的,调用时的括号才是用来装实参的,都是括号但是意义不一样。 你要分清声明和表达式是两种东西,哪怕是纯 C 这种声明极度变态得像是表达式,它也还是个声明。 反正我写 git commit 的时候都只会写 add foo() or add bar{},如果每次都写 function class ,又累又冗余。 |
6
julyclyde 2023-01-28 10:38:03 +08:00
这句注释写在 def counter()后边,那自然是用来解释 def 的
|