鱼C论坛

 找回密码
 立即注册
查看: 1027|回复: 6

第20讲 内嵌函数和闭包 讲课过程中的疑惑

[复制链接]
发表于 2019-5-29 11:45:03 | 显示全部楼层 |阅读模式

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

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

x
首先先承认函数这部分学的有点云里雾里的

小甲鱼举得例子
>>>def fun1():
                   x=5
             def fun2():
                   x*=x
                   return x
             return fun2
>>>fun1()
不会报错,会报<function fun1.<local>.Fun2 at 0000000>这样的一个东西

但是!!!

>>>def fun1():
                   x=5
             def fun2():
                   x*=x
                   return x
             return fun2()
>>>fun1()
这样就会报错。

我的问题是:return fun2和return fun2()的区别是什么?为什么第一个不报错,第二个报错
                     我理解的return就是有点像初高中学的函数公式,就是说这个函数应该按什么样的公式执行。不知道对不对

小甲鱼解释的 x=5 对于 fun2() 而言是一个不是全局变量的外部函数,  x*=x 相当于在内部函数中改变全局函数,原来的 x=5 已经被屏蔽了,所以必须对 x 重新赋值,这一部分我明白。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-5-29 12:20:47 | 显示全部楼层
你好。
这块内容我也迷迷糊糊的
但是我的理解是:fun2()类似于一个值,fun2则类似于一个函数……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-29 12:23:57 | 显示全部楼层
止增笑耳哈哈哈 发表于 2019-5-29 12:20
你好。
这块内容我也迷迷糊糊的
但是我的理解是:fun2()类似于一个值,fun2则类似于一个函数……

我跟你理解的刚好相反,我觉得fun2()是个函数
因为在创建函数的时候要用的是fun(),也就是是说fun()是函数的体现形式
但是我也不知道对不对
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-29 17:58:34 | 显示全部楼层
首先说明一点,这两个程序都是运行不起来的,里面的x局部变量是没有引用的(local variable 'x' referenced before assignment)被屏蔽了起来。两者区别在于有没有到达错误的边缘,如果你第一个写fun1()(),一样的报错。加不加(),只是在这里体现为传不传参数的区别。fun1()函数返回值是fun2,这里并没有调用哦,在idle中,直接打印的,于是这个地址被打印了出来。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-29 22:39:22 | 显示全部楼层
都淡忘 发表于 2019-5-29 17:58
首先说明一点,这两个程序都是运行不起来的,里面的x局部变量是没有引用的(local variable 'x' referenced ...

谢谢回复
但是我还是不太明白你说“加不加(),只是在这里体现为传不传参数的区别。”这里是什么意思。
其实我还有一个问题是关于视频里的改进方式的,能不能麻烦你帮我看看
>>> def fun1():
                x=5
               def fun2():
                     nonlocal x
                     x*=x
                     return x
               return fun2
   >>> fun1()

这里的nonlocal x的x是前面x=5的x,还是x*=x的x??
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-30 09:48:59 | 显示全部楼层
按照代码逻辑慢慢看就渐渐懂了。
nonlocal关键字意思就是这个x变量不是局部变量了,意味着在fun2()函数里也可修改外部的变量,于是这里的x就有了引用,也就是5,最后结果是25。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-30 10:21:43 | 显示全部楼层
都淡忘 发表于 2019-5-30 09:48
按照代码逻辑慢慢看就渐渐懂了。
nonlocal关键字意思就是这个x变量不是局部变量了,意味着在fun2()函数里 ...

好的谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-16 03:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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