鱼C论坛

 找回密码
 立即注册
查看: 679|回复: 16

[已解决]有关闭包的问题求助

[复制链接]
发表于 2020-6-5 22:02:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 lingedu 于 2020-6-5 22:02 编辑
  1. def funx(x):
  2.    
  3.     def funy(y):
  4.         return x*y
  5.     return funy(y)
  6. funx(5)(6)
复制代码



这个代码为啥会报错啊,把最后一行改为:return funy就不会报错,闭包那一节没太明白funy()和funy(y)有啥区别啊?
最佳答案
2020-6-5 22:33:22
     return funx 是返回函数 funy() 的调用地址,而 return funy() 返回的是对函数 funy() 的调用结果。
     例如:
  1.      a , b = input , print
  2.      s = a("请输入一个字符串")
  3.      b('你输入的字符串是 : ' , s)
复制代码

     在本例中,a , b 分别被赋值为系统函数 input() 和 print() 的调用地址,此后,a() 和 b() 便分别可以代表对 input()  和 print() 的调用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-5 22:04:42 | 显示全部楼层
因为你里面如果直接 funy(y) 这里会报错 NameError  因为没有定义 y 呀

闭包返回的是 funy 吧 不是 funy()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-5 22:07:11 | 显示全部楼层
如果单纯是个函数名(不带括号) 则只是把这个函数赋值给了一个变量
等于就是取了个外号的意思,而外号名就是那个被赋值的变量

如果是函数带上括号 则表示调用函数,就是执行函数的意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-5 22:33:22 | 显示全部楼层    本楼为最佳答案   
     return funx 是返回函数 funy() 的调用地址,而 return funy() 返回的是对函数 funy() 的调用结果。
     例如:
  1.      a , b = input , print
  2.      s = a("请输入一个字符串")
  3.      b('你输入的字符串是 : ' , s)
复制代码

     在本例中,a , b 分别被赋值为系统函数 input() 和 print() 的调用地址,此后,a() 和 b() 便分别可以代表对 input()  和 print() 的调用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-5 22:38:53 | 显示全部楼层
name = function

把一个函数的名字不带括号赋值,表示name也等于这个函数,可以用name()运行这个函数。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你怎么这么快呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-5 22:39:56 | 显示全部楼层
Stubborn 发表于 2020-6-5 22:39
你怎么这么快呀

快啥?  没你快
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-5 23:05:35 | 显示全部楼层
jackz007 发表于 2020-6-5 22:33
return funx 是返回函数 funy() 的调用地址,而 return funy() 返回的是对函数 funy() 的调用结果。
...

我想问下,我的例子:
如果还是return funy(y)
那不就是返回funy(y)函数调用的的结果吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是的,()表示运行函数,不带表示传递一个函数地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-5 23:09:54 | 显示全部楼层
Stubborn 发表于 2020-6-5 23:06
是的,()表示运行函数,不带表示传递一个函数地址

但是他为什么会报错呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-5 23:12:53 | 显示全部楼层
jackz007 发表于 2020-6-5 22:33
return funx 是返回函数 funy() 的调用地址,而 return funy() 返回的是对函数 funy() 的调用结果。
...

我想问下,我的例子:
如果还是return funy(y)
那不就是返回funy(y)函数调用的的结果吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-5 23:15:52 | 显示全部楼层
本帖最后由 jackz007 于 2020-6-5 23:17 编辑

      如果是 return funy() 的情况,那么,只能用一个括号对 funx() 进行调用;只有在 return funy 的情况下才可以用双括号对 funx() 进行调用。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

我想问下
如果还是return funy(y)
那不就是返回funy(y)函数调用的的结果吗?
是因为y这个变量没有赋值报错是吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

因为你是把内嵌函数返回的结果也给返回了 下次就不能调用了 除非内嵌里还内嵌...但是返回的必须是 一个函数名 而不是你调用函数后的结果   简单的说就是返回的是不带括号的函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-5 23:22:37 | 显示全部楼层
jackz007 发表于 2020-6-5 23:15
如果是 return funy() 的情况,那么,只能用一个括号对 funx() 进行调用;只有在 return funy 的情况 ...

也就是说这个成语要改写的话改写成这样
  1. def funx(x):
  2.    
  3.     def funy(y):
  4.         return x*y
  5.     return funy(6)
  6. funx(5)
复制代码

是这样吧,返回funy()函数y赋值为6时的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

那是不是改成return funy(6),之后调用funx(x = 5)就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-5 23:25:55 | 显示全部楼层
lingedu 发表于 2020-6-5 23:24
那是不是改成return funy(6),之后调用funx(x = 5)就行了

对的  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 22:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表