鱼C论坛

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

[技术交流] 《零基础入门学习Python》第20讲笔记

[复制链接]
发表于 2017-7-10 09:12:12 | 显示全部楼层 |阅读模式

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

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

x
020 内嵌函数和闭包

global关键字:在函数内使相关变量变成全局变量。

内嵌函数(最简单的例子):
  1. def fun1():
  2.         print('fun1()被调用')
  3.         def fun2():
  4.                 print('fun2()被调用')
  5.         fun2()

  6. >>> fun1()
  7. fun1()被调用
  8. fun2()被调用
复制代码


注意:在fun1()内可以调用fun2(),但是在fun1()外面就不能调用了。

闭包——函数式编程的重要结构
基本例子:
  1. def funX(x):
  2.         def funY(y):
  3.                 return x * y
  4.         return funY

  5. >>> i = funX(8)  # i就变成了一个函数,默认x值为8,再输入闭包的y即可
  6. >>> type(i)      # <class 'function'>

  7. % 两种调用方式:
  8. >>> i(8)
  9. 64
  10. >>> funX(8)(7)
  11. 56
复制代码


注:外部也不能调用内部闭包函数。

列表不会存在于栈里面,为避免闭包函数内引用外部函数参数时出现错误,可以这样做:
  1. def f1():
  2.         x = [5]
  3.         def f2():
  4.                 x[0] *= x[0]
  5.                 return x[0]
  6.         return f2()

  7. >>> f1()
  8. 25
复制代码

但是这种委曲求全的方法不太好,就有了关键字:nonlocal
  1. >>> def f1():
  2.         x = 5
  3.         def f2():
  4.                 nonlocal x  # 表示不是局部变量
  5.                 x *= x
  6.                 return x
  7.         return f2()

  8. >>> f1()
  9. 25
复制代码

注:这样就不会报错了!

测试题:
0.        在函数中修改全局变量的值:global
1.        在嵌套函数张红修改外部函数的局部变量:nonlocal
2.        Python函数可嵌套,但要注意作用域
问题:函数内部函数不能在外面直接调用
3.        B问题:内嵌函数未給var变量赋值,就引用了
4.        如何访问?
  1. def funOut():
  2.     def funIn():
  3.         print('宾果!你成功访问到我啦!')
  4.     return funIn()
复制代码

funOut()
5.        如何调用?
  1. def funOut():
  2.     def funIn():
  3.         print('宾果!你成功访问到我啦!')
  4.     return funIn   # 不同点
复制代码

funOut()()

也可以曲线救国:
  1. go = funOut()
  2. go()
  3. 宾果!你成功访问到我啦!
复制代码


6.        目测打印内容:
  1. def funX():
  2.     x = 5
  3.     def funY():
  4.         nonlocal x
  5.         x += 1
  6.         return x
  7.     return funY

  8. a = funX()
  9. print(a())
  10. print(a())
  11. print(a())
复制代码


内容:
6
7
8

为什么会有全局变量的效果?
当a = funX()的时候,只要a变量未被重新赋值,funX()就没有被释放,也就是说局部变量(LV)没有被初始化。
所以当全局变量不适合的时候,可以考虑使用闭包更稳定和安全。

评分

参与人数 2荣誉 +5 鱼币 +7 收起 理由
康小泡 + 2
小甲鱼 + 5 + 5 支持楼主!

查看全部评分

本帖被以下淘专辑推荐:

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 06:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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