1.内嵌函数:在函数中定义函数
#代码段1
>>> def fun1():
print('外层函数正在被调用')
def fun2():
print('内层函数正在被调用')
>>> fun1()
外层函数正在被调用
#代码段2
>>> def fun1():
print('外层函数正在被调用')
def fun2():
print('内层函数正在被调用')
fun2()
>>> fun1()
外层函数正在被调用
内层函数正在被调用
>>> fun2() #内嵌函数直接被调用
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
fun2()
NameError: name 'fun2' is not defined
注:①内嵌函数不能再外层函数被调用的过程中自动被调用 ②内部函数不能被外部直接使用,需要通过其外层函数的调用发挥作用
2.闭包:出现在嵌套函数中,指的是内层函数引用到了外层函数的变量,就形成了闭包
>>> def funX(x):
def funY(y):
return x*y
return funY #返回内层函数
>>> funX(2)(5) #对闭包的调用
10
#注:
>>> m=funX(2) #只对外层函数进行了调用
>>> type(m) #所以函数的返回类型及m的类型为function
<type 'function'>
>>> m(3) #继续对内层函数进行调用
6
3.在函数内部修改全局变量的值:global关键字
>>> num=3
>>> def count():
global num
num=5
print(num)
>>> count()
5
>>> num
5
注:能不直接访问全局变量尽量不要访问,如需使用全局变量可以使用函数进行传参。
4.在内嵌函数中修改外部函数的局部变量:nonlocal关键字
>>> def fun1():
x=5
def fun2():
nonlocal x
x+=7
return x
return fun2
>>> fun1()()
12
练习1:以下是闭包的一个例子,目测一下会打印什么内容?
#例子1:
def funX():
x=5
def funY():
nonlocal x
x+=1
return x
return funY
a=funX()
print(a())
print(a())
print(a())
#例子2:
def funX():
x=5
def funY():
nonlocal x
x+=1
return x
return funY
a=funX()
print(a())
a=funX()
print(a())
a=funX()
print(a())
#例子1结果:
6
7
8
#例子2结果:
6
6
6
注:例子2中局部变量x在每次调用时都被重新赋值了,所以结果都是6。但是例子1中,a=funX()的时候,只要a变量没有被重新赋值,funX()就没有被释放,也就是说局部变量x没有被重新初始化。
注:当全局变量不适用时,可以考虑使用闭包更安全更稳定