有关闭包的问题求助
本帖最后由 lingedu 于 2020-6-5 22:02 编辑def funx(x):
def funy(y):
return x*y
return funy(y)
funx(5)(6)
这个代码为啥会报错啊,把最后一行改为:return funy就不会报错,闭包那一节没太明白funy()和funy(y)有啥区别啊? 因为你里面如果直接 funy(y) 这里会报错 NameError因为没有定义 y 呀
闭包返回的是 funy 吧 不是 funy() 如果单纯是个函数名(不带括号) 则只是把这个函数赋值给了一个变量
等于就是取了个外号的意思,而外号名就是那个被赋值的变量
如果是函数带上括号 则表示调用函数,就是执行函数的意思 return funx 是返回函数 funy() 的调用地址,而 return funy() 返回的是对函数 funy() 的调用结果。
例如:
a , b = input , print
s = a("请输入一个字符串")
b('你输入的字符串是 : ' , s)
在本例中,a , b 分别被赋值为系统函数 input() 和 print() 的调用地址,此后,a() 和 b() 便分别可以代表对 input()和 print() 的调用。 name = function
把一个函数的名字不带括号赋值,表示name也等于这个函数,可以用name()运行这个函数。 Twilight6 发表于 2020-6-5 22:07
如果单纯是个函数名(不带括号) 则只是把这个函数赋值给了一个变量
等于就是取了个外号的意思,而外号名就 ...
你怎么这么快呀 Stubborn 发表于 2020-6-5 22:39
你怎么这么快呀
快啥?没你快{:10_256:} jackz007 发表于 2020-6-5 22:33
return funx 是返回函数 funy() 的调用地址,而 return funy() 返回的是对函数 funy() 的调用结果。
...
我想问下,我的例子:
如果还是return funy(y)
那不就是返回funy(y)函数调用的的结果吗? lingedu 发表于 2020-6-5 23:05
我想问下,我的例子:
如果还是return funy(y)
那不就是返回funy(y)函数调用的的结果吗?
是的,()表示运行函数,不带表示传递一个函数地址 Stubborn 发表于 2020-6-5 23:06
是的,()表示运行函数,不带表示传递一个函数地址
但是他为什么会报错呢? jackz007 发表于 2020-6-5 22:33
return funx 是返回函数 funy() 的调用地址,而 return funy() 返回的是对函数 funy() 的调用结果。
...
我想问下,我的例子:
如果还是return funy(y)
那不就是返回funy(y)函数调用的的结果吗? 本帖最后由 jackz007 于 2020-6-5 23:17 编辑
如果是 return funy() 的情况,那么,只能用一个括号对 funx() 进行调用;只有在 return funy 的情况下才可以用双括号对 funx() 进行调用。 Twilight6 发表于 2020-6-5 22:07
如果单纯是个函数名(不带括号) 则只是把这个函数赋值给了一个变量
等于就是取了个外号的意思,而外号名就 ...
我想问下
如果还是return funy(y)
那不就是返回funy(y)函数调用的的结果吗?
是因为y这个变量没有赋值报错是吗?
lingedu 发表于 2020-6-5 23:16
我想问下
如果还是return funy(y)
那不就是返回funy(y)函数调用的的结果吗?
主要不是这个原因,你如果想不报错可以在外部函数里面设置个 y 变量的值,但是 funy(y) 你这样返回就不叫闭包了
因为你是把内嵌函数返回的结果也给返回了 下次就不能调用了 除非内嵌里还内嵌...但是返回的必须是 一个函数名 而不是你调用函数后的结果 简单的说就是返回的是不带括号的函数
jackz007 发表于 2020-6-5 23:15
如果是 return funy() 的情况,那么,只能用一个括号对 funx() 进行调用;只有在 return funy 的情况 ...
也就是说这个成语要改写的话改写成这样
def funx(x):
def funy(y):
return x*y
return funy(6)
funx(5)
是这样吧,返回funy()函数y赋值为6时的值
Twilight6 发表于 2020-6-5 23:19
主要不是这个原因,你如果想不报错可以在外部函数里面设置个 y 变量的值,但是 funy(y) 你这样返回就不叫 ...
那是不是改成return funy(6),之后调用funx(x = 5)就行了 lingedu 发表于 2020-6-5 23:24
那是不是改成return funy(6),之后调用funx(x = 5)就行了
对的
页:
[1]