鱼C论坛

 找回密码
 立即注册
查看: 1868|回复: 0

[技术交流] 《零基础入门学习python》第二十讲笔记:函数:内嵌函数和闭包

[复制链接]
发表于 2017-7-31 11:47:15 | 显示全部楼层 |阅读模式

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

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

x
global关键字; 在函数里面定义一个global 变量,使之变成全局变量

内嵌函数:在函数内部创建另一个函数
  1. >>> def fun1():
  2.             print('fun1()正在被调用。。。')
  3.             def fun2():   #函数嵌套
  4.                  print('fun2()正在被调用。。。')
  5.             fun2()


  6. >>> fun1()  # 执行的过程是先走到def fun1(),print('fun1()正在被调用。。 '),然后到fun2(),然后再到def fun2(),print('fun2()正在被调用。。。 ')
  7. fun1()正在被调用。。。
  8. fun2()正在被调用。。。
  9. >>>

  10. >>> fun2()
  11. Traceback (most recent call last):
  12.   File "<pyshell#12>", line 1, in <module>
  13.     fun2()
  14. NameError: name 'fun2' is not defined
复制代码


上面这个例子。只有fun1()能调用fun2(),出了fun1(),没人能调用得到fun2()

闭包:如果在一个内部函数里引用外部作用域的变量,那么这个内部函数就称为闭包
  1. >>> def funx(x):
  2.              def funy(y):
  3.                   return x * y
  4.              return funy    #python所有东西都是对象,可以返回函数对象

  5. >>> i = funx(8)  # 调用funx(),并给实参8,然后赋值给i
  6. >>> i
  7. <function funy at 0x000000000324AEC8>
  8. >>> type(i)   #  i 是一个函数,因为funx()返回的是一个函数
  9. <class 'function'>
  10. >>> i(5)    # 给y的参数设为5
  11. 40
  12. >>> funx(8)(5)   # 或者直接两个括号分别传实参
  13. 40
  14. >>> funy(5)  # 在全局调用内部函数会报错
  15. Traceback (most recent call last):
  16.   File "<pyshell#20>", line 1, in <module>
  17.     funy(5)
  18. NameError: name 'funy' is not defined
复制代码


在闭包中,外部函数的变量相对内部函数的变量,相当于全局变量和局域变量的关系。在内部函数,只能访问外部函数变量而不能修改
  1. >>> def fun1():
  2.              x = 5
  3.              def fun2():
  4.                  x *= x     # 这里fun2函数里修改fun()函数里x变量的值,是不允许的,只能访问
  5.                  return x
  6.           return fun2()

  7. >>> fun1()
  8. Traceback (most recent call last):
  9.   File "<pyshell#28>", line 1, in <module>
  10.     fun1()
  11.   File "<pyshell#27>", line 6, in fun1
  12.     return fun2()
  13.   File "<pyshell#27>", line 4, in fun2
  14.     x *= x
  15. UnboundLocalError: local variable 'x' referenced before assignment
  16. >>>
  17. >>> def fun1():
  18.              x = [5]  # 把x换成列表类型,因为列表不存放在栈里面,数据不会被清空,这只是一个临时的投机取巧方法
  19.              def fun2():
  20.                  x[0] *= x[0]
  21.                  return x[0]
  22.              return fun2()

  23. >>> fun1()
  24. 25
  25. >>> def fun1():
  26.     x = 5
  27.     def fun2():
  28.         nonlocal x    #把外部函数变量x 在内部函数里定义成nonlocal,这样就能修改外部函数x的值了
  29.         x *= x
  30.         return x
  31.     return fun2()

  32. >>> fun1()
  33. 25
复制代码

总结:在内部函数定义了nonlocal 变量,然后将此变量重新赋值。 拿到全局去,此值仍然有效。
          funx() 是一个函数,但funx 和 funx() 最大区别是后者会走到def funx()那里去,而前者不会,前者作为return的话,返回的就是一个函数对象。
          如果在函数中修改全局变量的值,需先用global 定义一下这个变量,如果想在内部函数修改外部函数的值,应使用nonlocal定义一下这个变量

评分

参与人数 1鱼币 +5 收起 理由
小甲鱼 + 5 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-26 05:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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