lingedu 发表于 2020-6-5 22:02:44

有关闭包的问题求助

本帖最后由 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)有啥区别啊?

Twilight6 发表于 2020-6-5 22:04:42

因为你里面如果直接 funy(y) 这里会报错 NameError因为没有定义 y 呀

闭包返回的是 funy 吧 不是 funy()

Twilight6 发表于 2020-6-5 22:07:11

如果单纯是个函数名(不带括号) 则只是把这个函数赋值给了一个变量
等于就是取了个外号的意思,而外号名就是那个被赋值的变量

如果是函数带上括号 则表示调用函数,就是执行函数的意思

jackz007 发表于 2020-6-5 22:33:22

   return funx 是返回函数 funy() 的调用地址,而 return funy() 返回的是对函数 funy() 的调用结果。
   例如:
   a , b = input , print
   s = a("请输入一个字符串")
   b('你输入的字符串是 : ' , s)
   在本例中,a , b 分别被赋值为系统函数 input() 和 print() 的调用地址,此后,a() 和 b() 便分别可以代表对 input()和 print() 的调用。

Stubborn 发表于 2020-6-5 22:38:53

name = function

把一个函数的名字不带括号赋值,表示name也等于这个函数,可以用name()运行这个函数。

Stubborn 发表于 2020-6-5 22:39:27

Twilight6 发表于 2020-6-5 22:07
如果单纯是个函数名(不带括号) 则只是把这个函数赋值给了一个变量
等于就是取了个外号的意思,而外号名就 ...

你怎么这么快呀

Twilight6 发表于 2020-6-5 22:39:56

Stubborn 发表于 2020-6-5 22:39
你怎么这么快呀

快啥?没你快{:10_256:}

lingedu 发表于 2020-6-5 23:05:35

jackz007 发表于 2020-6-5 22:33
return funx 是返回函数 funy() 的调用地址,而 return funy() 返回的是对函数 funy() 的调用结果。
...

我想问下,我的例子:
如果还是return funy(y)
那不就是返回funy(y)函数调用的的结果吗?

Stubborn 发表于 2020-6-5 23:06:15

lingedu 发表于 2020-6-5 23:05
我想问下,我的例子:
如果还是return funy(y)
那不就是返回funy(y)函数调用的的结果吗?

是的,()表示运行函数,不带表示传递一个函数地址

lingedu 发表于 2020-6-5 23:09:54

Stubborn 发表于 2020-6-5 23:06
是的,()表示运行函数,不带表示传递一个函数地址

但是他为什么会报错呢?

lingedu 发表于 2020-6-5 23:12:53

jackz007 发表于 2020-6-5 22:33
return funx 是返回函数 funy() 的调用地址,而 return funy() 返回的是对函数 funy() 的调用结果。
...

我想问下,我的例子:
如果还是return funy(y)
那不就是返回funy(y)函数调用的的结果吗?

jackz007 发表于 2020-6-5 23:15:52

本帖最后由 jackz007 于 2020-6-5 23:17 编辑

      如果是 return funy() 的情况,那么,只能用一个括号对 funx() 进行调用;只有在 return funy 的情况下才可以用双括号对 funx() 进行调用。

lingedu 发表于 2020-6-5 23:16:32

Twilight6 发表于 2020-6-5 22:07
如果单纯是个函数名(不带括号) 则只是把这个函数赋值给了一个变量
等于就是取了个外号的意思,而外号名就 ...

我想问下
如果还是return funy(y)
那不就是返回funy(y)函数调用的的结果吗?
是因为y这个变量没有赋值报错是吗?

Twilight6 发表于 2020-6-5 23:19:29

lingedu 发表于 2020-6-5 23:16
我想问下
如果还是return funy(y)
那不就是返回funy(y)函数调用的的结果吗?


主要不是这个原因,你如果想不报错可以在外部函数里面设置个 y 变量的值,但是 funy(y) 你这样返回就不叫闭包了

因为你是把内嵌函数返回的结果也给返回了 下次就不能调用了 除非内嵌里还内嵌...但是返回的必须是 一个函数名 而不是你调用函数后的结果   简单的说就是返回的是不带括号的函数

lingedu 发表于 2020-6-5 23:22:37

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时的值

lingedu 发表于 2020-6-5 23:24:13

Twilight6 发表于 2020-6-5 23:19
主要不是这个原因,你如果想不报错可以在外部函数里面设置个 y 变量的值,但是 funy(y) 你这样返回就不叫 ...

那是不是改成return funy(6),之后调用funx(x = 5)就行了

Twilight6 发表于 2020-6-5 23:25:55

lingedu 发表于 2020-6-5 23:24
那是不是改成return funy(6),之后调用funx(x = 5)就行了

对的
页: [1]
查看完整版本: 有关闭包的问题求助