Python FAQ 005 闭包(2)
本帖最后由 qiuyouzhi 于 2020-3-4 12:04 编辑Python FAQ 005
问题:
闭包没听太懂,课后习题中有两题:
1、
def funOut():
def funIn():
print("……")
return funIn()
2、
def funOut():
def funIn():
print("……")
return funIn
这两题最后一行,这个返回的,有括号和没括号有什么区别?
(原文: https://fishc.com.cn/forum.php?mod=viewthread&tid=151273&highlight=Python%B1%D5%B0%FC)
解答:
有括号是返回这个函数,没有括号是返回这个函数对象
如果返回的是函数,那么调用外部的函数就必定会调用内部的函数
举个代码例子:
def funX(x):
print(x)
def funY(y):
x *= y
return x
return funY(5)
print(funX(5))
运行这段代码后,一定会打印出25
但是,如果稍微改一改:
def funX(x):
print(x)
def funY(y):
nonlocal x
x *= y
return x
return funY
a = funX(5)
print(a(50))
print(a(25))
这时我们发现,funY 的参数可以在外部变动了!
而这就是 funY 的好处
当然,如果在一些特殊的情况,还是第一种写法比较好~~~
本人才疏学浅,如果有纰漏,请在评论区指出! 建议把 by xxx 去掉 一个账号 发表于 2020-3-4 11:38
建议把 by xxx 去掉
已去 这里没有解答提问也是比较多的一个问题
明明是一个变量,为什么要加括号呢
尤其有人再简写时,更会出现函数后面再套一个括号,更是难倒一大批 def funX(x):
print(x)
def funY(y):
x *= y
return x
return funY(5)
print(funX(5))
不懂为什么输出25呀 {:10_266:} def funX(x):
print(x)
def funY(y):
x *= y
return x
return funY(5)
print(funX(5))
不懂为什么输出25呀 aaawrl 发表于 2020-4-10 04:36
def funX(x):
print(x)
def funY(y):
按着函数调用过程来:
funx里面是一个funY,
funY的定义的funX的参数
乘上funY的参数,然后返回
结果。(这是定义,没有调用!)
然后返回funY(5),这时候调用funY,
把funX的参数和funY的参数相乘,
然后返回结果。 qiuyouzhi 发表于 2020-4-10 07:37
按着函数调用过程来:
funx里面是一个funY,
funY的定义的funX的参数
感谢!
页:
[1]