马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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)没有被初始化。
所以当全局变量不适合的时候,可以考虑使用闭包更稳定和安全。
|