|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
020 内嵌函数和闭包
global关键字:在函数内使相关变量变成全局变量。
内嵌函数(最简单的例子):
- def fun1():
- print('fun1()被调用')
- def fun2():
- print('fun2()被调用')
- fun2()
- >>> fun1()
- fun1()被调用
- fun2()被调用
复制代码
注意:在fun1()内可以调用fun2(),但是在fun1()外面就不能调用了。
闭包——函数式编程的重要结构
基本例子:
- def funX(x):
- def funY(y):
- return x * y
- return funY
- >>> i = funX(8) # i就变成了一个函数,默认x值为8,再输入闭包的y即可
- >>> type(i) # <class 'function'>
- % 两种调用方式:
- >>> i(8)
- 64
- >>> funX(8)(7)
- 56
复制代码
注:外部也不能调用内部闭包函数。
列表不会存在于栈里面,为避免闭包函数内引用外部函数参数时出现错误,可以这样做:
- def f1():
- x = [5]
- def f2():
- x[0] *= x[0]
- return x[0]
- return f2()
- >>> f1()
- 25
复制代码
但是这种委曲求全的方法不太好,就有了关键字:nonlocal
- >>> def f1():
- x = 5
- def f2():
- nonlocal x # 表示不是局部变量
- x *= x
- return x
- return f2()
- >>> f1()
- 25
复制代码
注:这样就不会报错了!
测试题:
0. 在函数中修改全局变量的值:global
1. 在嵌套函数张红修改外部函数的局部变量:nonlocal
2. Python函数可嵌套,但要注意作用域
问题:函数内部函数不能在外面直接调用
3. B问题:内嵌函数未給var变量赋值,就引用了
4. 如何访问?
- def funOut():
- def funIn():
- print('宾果!你成功访问到我啦!')
- return funIn()
复制代码
funOut()
5. 如何调用?
- def funOut():
- def funIn():
- print('宾果!你成功访问到我啦!')
- return funIn # 不同点
复制代码
funOut()()
也可以曲线救国:
- go = funOut()
- go()
- 宾果!你成功访问到我啦!
复制代码
6. 目测打印内容:
- def funX():
- x = 5
- def funY():
- nonlocal x
- x += 1
- return x
- return funY
- a = funX()
- print(a())
- print(a())
- print(a())
复制代码
内容:
6
7
8
为什么会有全局变量的效果?
当a = funX()的时候,只要a变量未被重新赋值,funX()就没有被释放,也就是说局部变量(LV)没有被初始化。
所以当全局变量不适合的时候,可以考虑使用闭包更稳定和安全。
|
评分
-
查看全部评分
|