开发者社区> 问答> 正文

python闭包什么时候使用

python闭包什么时候使用

展开
收起
云计算小粉 2018-05-10 20:11:02 1769 0
2 条回答
写回答
取消 提交回答
  • 简单理解:闭包就是函数返回的是一个函数。

    2019-11-06 11:14:52
    赞同 展开评论 打赏
  • 热衷于研究前端新知识,学习新技术。精通HTML5+CSS3,Javascript,jQuery,Angular,Bootstrap。

    闭包——装饰器的本质也是闭包
    “闭包”的本质就是函数的嵌套定义,即在函数内部再定义函数,如下所示。
    “闭包”有两种不同的方式,第一种是在函数内部就“直接调用了”;第二种是“返回一个函数名称”。
    (1)第一种形式——直接调用
    def Maker(name):
    num=100
    def func1(weight,height,age):
    weight+=1
    height+=1
    age+=1
    print(name,weight,height,age)
    func1(100,200,300) #在内部就直接调用“内部函数”
    Maker('feifei') #调用外部函数,输出 feifei 101 201 301
    (2)第二种形式——返回函数名称
    def Maker(name):
    num=100
    def func1(weight,height,age):
    weight+=1
    height+=1
    age+=1
    print(name,weight,height,age)
    return func1 #此处不直接调用,而是返回函数名称(Python中一切皆对象)
    maker=Maker('feifei') #调用包装器
    maker(100,200,300) #调用内部函数
    (3)“闭包”的作用——保存函数的状态信息,使函数的局部变量信息依然可以保存下来,如下。
    ef Maker(step): #包装器
    num=1
    def fun1(): #内部函数
    nonlocal num #nonlocal关键字的作用和前面的local是一样的,如果不使用该关键字,则不能再内部函数改变“外部变量”的值
    num=num+step #改变外部变量的值(如果只是访问外部变量,则不需要适用nonlocal)
    print(num)
    return fun1

    =====================================

    j=1
    func2=Maker(3) #调用外部包装器
    while(j<5):
    func2() #调用内部函数4次 输出的结果是 4、7、10、13
    j+=1
    从上面的例子可以看出,外部装饰器函数的局部变量num=1、以及调用装饰器Maker(3)时候传入的参数step=3都被记忆了下来,所以才有1+3=4、4+3=7、7+3=10、10+3=13.
    从这里可以看出,Maker函数虽然调用了,但是它的局部变量信息却被保存了下来,这就是“闭包”的最大的作用——保存局部信息不被销毁。

    2019-07-17 22:24:46
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载