[python3]内嵌函数和闭包

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

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值