关于 closure 的一个疑问

2023-01-25 17:54:44 +08:00
 JasonLaw

我正在阅读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 ,对吧?

1842 次点击
所在节点    Python
6 条回复
Tyanboot
2023-01-26 02:59:23 +08:00
这里的注释里面的 counter() 应该是表达“counter 函数”的意思,而不是表达“counter 函数调用后返回的那个东西”的意思。

加了个括号在后面只是为了表达类型,而不是真的在调用,正常来说不应该会有歧义的吧。
gowl
2023-01-26 03:02:59 +08:00
他想表达的是 counter 这个函数是 closure ,但是他用了 counter() 这种「调用」形式,不如你理解的 counter 这种「函数值」形式更准确。
gowl
2023-01-26 03:09:17 +08:00
如果用 ML 家族的语言来表述,可以说:counter 这个类型为 (unit -> int) 的值是一个 closure 。这样就没有歧义了。
JasonLaw
2023-01-26 07:40:46 +08:00
@Tyanboot #1 counter()和 counter 它们两个完全是不同的东西,counter 才是一个 function 。
yulon
2023-01-26 11:37:16 +08:00
照你的逻辑,那么 def counter() 也是有语病的,你应该发明一个 def function counter 。

实际上 def 里面的括号是用来装形参而不是实参的,调用时的括号才是用来装实参的,都是括号但是意义不一样。

你要分清声明和表达式是两种东西,哪怕是纯 C 这种声明极度变态得像是表达式,它也还是个声明。

反正我写 git commit 的时候都只会写 add foo() or add bar{},如果每次都写 function class ,又累又冗余。
julyclyde
2023-01-28 10:38:03 +08:00
这句注释写在 def counter()后边,那自然是用来解释 def 的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/910608

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX