1.内嵌函数
内嵌函数(允许在函数内部创建另一个函数,叫内部函数)
def fun1():
print('fun1 is using...')
def fun2():
print('fun2 is using...')
fun2()
print('fun1 end...')
fun1()
'''输出如下;
fun1 is using...
fun2 is using...
fun1 end...
'''
注意:内部函数的整个作用域都在外部函数之内,如fun2整个定义和调用的过程都在fun1里面,除了在fun1里可以任意调用,出了fun1之外无法被调用,会系统报错
2.闭包
闭包——函数式编程的重要语法结构。
如果在一个内部函数被外部作用域(但不是全局作用域的变量)进行引用,那么内部函数会被认为是闭包 。
def funX(x): #外部作用域 的变量 x
def funY(y): #内部函数(闭包)
return x * y #引用了x变量
return funY
i = funX(8)
print(i) #<function funX.<locals>.funY at 0x000002889E0E8510>
print(type(i)) #<class 'function'>
print(i(a)) #40
print(funX(8)(5)) #40
1.如下报错:
def fun1():
x = 5
def fun2():
print(x) #5
x *= x #
return x
return fun2()
print(fun1()) #UnboundLocalError: local variable 'x' referenced before assignment
2.如果想正确运行
def fun1():
x = [5]
print(x[0]) #5
def fun2():
print(x[0]) #5
x[0] *= x[0]
return x[0]
return fun2()
print(fun1()) #25
3.在python3.x中,也可以用关键字:nonlocal
def fun1():
x = 5
def fun2():
nonlocal x
x *= x
return x
return fun2()
print(fun1()) #25
#如何访问funIn()函数 #1 def funOut(): def funIn(): print("yes, funin") return funIn funOut()() #yes, funin #2 def funOut(): def funIn(): print("yes, funin") return funIn() funOut() #yes, funin
#a = funX()的时候,只要a变量没有被重新赋值,funX()就没有被释放,也就是说局部变量x就没有被重新初始化。 def funX(): x = 5 def funY(): nonlocal x x += 1 return x return funY a = funX() print(a()) #6 print(a()) #7 print(a()) #8