闭包——装饰器的本质也是闭包“闭包”的本质就是函数的嵌套定义,即在函数内部再定义函数,如下所示。
“闭包”有两种不同的方式,第一种是在函数内部就“直接调用了”;第二种是“返回一个函数名称”。
(1)第一种形式——直接调用def Maker(name):num=100def func1(weight,height,age):weight+=1height+=1age+=1print(name,weight,height,age)func1(100,200,300) #在内部就直接调用“内部函数”Maker(feifei)#调用外部函数,输出 feifei 101 201 301(2)第二种形式——返回函数名称def Maker(name):num=100def func1(weight,height,age):weight+=1height+=1age+=1print(name,weight,height,age)return func1#此处不直接调用,而是返回函数名称(Python中一切皆对象)maker=Maker(feifei) #调用包装器maker(100,200,300)#调用内部函数(3)“闭包”的作用——保存函数的状态信息,使函数的局部变量信息依然可以保存下来,如下。
ef Maker(step): #包装器num=1def fun1(): #内部函数nonlocal num#nonlocal关键字的作用和前面的local是一样的,如果不使用该关键字,则不能再内部函数改变“外部变量”的值num=num+step#改变外部变量的值(如果只是访问外部变量,则不需要适用nonlocal)print(num)return fun1#=====================================#j=1func2=Maker(3)#调用外部包装器while(j<5):func2() #调用内部函数4次 输出的结果是 4、7、10、13j+=1从上面的例子可以看出,外部装饰器函数的局部变量num=1、以及调用装饰器Maker(3)时候传入的参数step=3都被记忆了下来,所以才有1+3=4、4+3=7、7+3=10、10+3=13.从这里可以看出,Maker函数虽然调用了,但是它的局部变量信息却被保存了下来,这就是“闭包”的最大的作用——保存局部信息不被销毁。
fromcollectionsimportOrderedDictdic=OrderedDict()#声明有序字典()#清空有序字典dic[233]=233#加入键值对dir(OrderedDict)#列出所有的成员函数help(OrderedDict)#更多成员函数的帮助文档
D这个是判断语句,不能拿来设置变量
标签: python闭包到底有什么作用、本文地址: http://akl.dhslw.com/jishuwz/34a6c157bbcb398f24c6.html
上一篇:怎么读取json文件python怎么读取json格式数...