python基础拾遗005--闭包

理解闭包之前,先要理解函数引用。在python里面,函数名可以作为函数引用指向函数体。

def test_func():
    print('say hello')

test_func() #调用函数
print(test_func) #输出函数test_func的引用

b= test_func #将函数引用复制给变量b
b()#等价于调用test_func()

闭包:内部函数引用外部函数的变量,则内部函数称为闭包,所引用的变量称为自由变量。

当调用func=outter('MALI')的时候,只有两条写在inner函数外面的输出语句被执行,inner函数并没有执行,而是作为一个函数引用返回给了变量func

到调用func(12)的时候,12传给了inner函数的参数age,并执行了inner函数。

def outter(name):
    print ('my name is:' + str(name))

    def inner(age):
        print("----inner print----")
        print('name:' + str(name))
        print('age:' + str(age))
        print('-----end of inner print----')

    print('---end of outter print---')
    return inner

func = outter('MALI')
#输出:
#my name is:MALI
#---end of outter print---

func(12)
#输出
#----inner print----
# name:MALI
# age:12
# -----end of inner print----

关键字nolocal可以用在闭包里面,修改外部函数的变量。nolocal的作用和global关键字类似,外部函数的变量如果需要修改需要在内部函数里面声明为nolocal。如下面代码,如果去掉nolocal outter_num,则下面 outter_num+=100会报错:UnboundLocalError: local variable 'outter_num' referenced before assignment。 

def outter(num):
    outter_num=num
    def inner():
        nonlocal  outter_num
        outter_num+=100
        print(outter_num)
    return inner

inner=outter(100)
inner() #输出200

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值