鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: mumudontcry

[技术交流] 第19讲习题代码以及分析

[复制链接]
 楼主| 发表于 2014-7-31 13:51:59 | 显示全部楼层
本帖最后由 mumudontcry 于 2014-7-31 13:56 编辑
小甲鱼 发表于 2014-7-31 13:44
bar在foo函数的代码块中定义。我们称bar是foo的内部函数。

在bar的局部作用域中可以直接访问foo局部 ...

就比如,我想让
    def funZ():
        print("Z")

    funZ()
放到
def funX():
    x = 5

    def funY():
        nonlocal x
        x += 1
        print("没有引用我")
        return x

    return funY
里面去(但不能放到funY里)

a = funX()
print(a())
print(a())
print(a())
的时候,会打印出“Z”,那要怎么做,还是说根本做不了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 13:55:45 | 显示全部楼层
小甲鱼 发表于 2014-7-31 13:44
bar在foo函数的代码块中定义。我们称bar是foo的内部函数。

在bar的局部作用域中可以直接访问foo局部 ...

除了这个
你顺便看下第20讲(一)的那篇我关于闭包的三点,应该是这么理解吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-31 13:59:21 | 显示全部楼层
mumudontcry 发表于 2014-7-31 13:42
def funX():
    x = 5
    def funY():

感受一下,这里 a = funX() 其实是得到 funY 函数的地址,然后把它的地址给 a,所以你再调用 a() 就相当于只调用 funY()

  1. >>> def funX():
  2.         x = 5
  3.         print('funX被调用')
  4.         def FunY():
  5.                 nonlocal x
  6.                 x += 1
  7.                 print("funY被调用")
  8.                 return x
  9.         return FunY

  10. >>> funX()
  11. funX被调用
  12. <function funX.<locals>.FunY at 0x034B1420>
  13. >>> funX()()
  14. funX被调用
  15. funY被调用
  16. 6
  17. >>> a = funX()
  18. funX被调用
  19. >>> a()
  20. funY被调用
  21. 6
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 14:01:20 | 显示全部楼层
小甲鱼 发表于 2014-7-31 13:59
感受一下,这里 a = funX() 其实是得到 funY 函数的地址,然后把它的地址给 a,所以你再调用 a() 就相当 ...

那funY后面的语句就永远不会执行喽?

点评

肯定啊 a = funX() 的理解是 a 取得 funX() 的返回值(它返回了 funY,也就是 funY() 的地址) 你调用 a(),其实就是 funY(),这时候除了变量作用域外,跟 funX() 是没关联的。 这跟 funX()() 要区别开,funX(  详情 回复 发表于 2014-7-31 14:05
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-31 14:05:25 | 显示全部楼层
mumudontcry 发表于 2014-7-31 14:01
那funY后面的语句就永远不会执行喽?

肯定啊 a = funX() 的理解是 a 取得 funX() 的返回值(它返回了 funY,也就是 funY() 的地址)

你调用 a(),其实就是 funY(),这时候除了变量作用域外,跟 funX() 是没关联的。

这跟 funX()() 要区别开,funX()() 是先调用 funX(),然后将返回值再进行一次调用,所以 funX()() 相当于“a = funX() 再 a() 的结果”
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-7-31 14:16:53 | 显示全部楼层
小甲鱼 发表于 2014-7-31 14:05
肯定啊 a = funX() 的理解是 a 取得 funX() 的返回值(它返回了 funY,也就是 funY() 的地址)

你调用 ...

a =funX()相当于是return funY,所以a =funY,而type funY后得到的是function,也就是说funY的值是funY的地址,而funY()表示调用这个函数,于是a()就是调用funY,也就是return x,也就是得到的6,于是每一次的使用a()就相当于只是调用funY,所以才不会x =5

点评

对的  详情 回复 发表于 2014-7-31 14:23
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-31 14:23:36 | 显示全部楼层
mumudontcry 发表于 2014-7-31 14:16
a =funX()相当于是return funY,所以a =funY,而type funY后得到的是function,也就是说funY的值是funY的 ...

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

使用道具 举报

 楼主| 发表于 2014-7-31 14:25:41 | 显示全部楼层

我在20讲的那篇里写了关于闭包的三个要点,你看下对不对(我觉得是对的

点评

好的,稍后我去看下~  详情 回复 发表于 2014-7-31 14:38
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-31 14:38:28 | 显示全部楼层
mumudontcry 发表于 2014-7-31 14:25
我在20讲的那篇里写了关于闭包的三个要点,你看下对不对(我觉得是对的)

好的,稍后我去看下~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 02:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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