介绍
本篇文章为大家展示了python中闭包的作用,代码简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
<强> 1,全球关键字的作用强>
如果在函数中需要修改全局变量,则需要使用该关键字,具体参见下面例子。
变量=100 def 函数(): 打印(变量),#在函数内不对全局变量修改,直接访问是没问题的,不会报的错 function(), #输出100 , 变量=100 def 函数(): + 111=结果变量 打印(结果),#在函数内不对全局变量修改,直接使用是没问题的,不会报的错 函数(),#输出211
变量=100 def 函数(): 变量+=111 打印(变量),#显示local variable & # 39;变量# 39;referenced before 作业。 #即在函数局部作用域中直接改变全局变量的值会报的错 函数()
变量=100 def 函数(): 变量=1000,#此时修改变量变量的值不会报错,因为已经在函数局部作用域内重新定义变量,会覆盖全局变量 变量+=111 打印(变量) function(), #输出1111 print(变量),#输出100年,虽然函数内部重新覆盖了变量,但是全局变量并未变,依然还是100
那如果不再函数内部重新为全局变量赋值,又想改变全局变量的值,应该怎么做呢?这就要使用全球关键字了,如下:
变量=100 def 函数(): global variable #使用全球关键字,表明变量是全局的,此时就可以了直接在函数局部作用域内改变变量的值了 变量+=111 打印(变量),#输出211 函数() print(变量),#输出211,这和上面的不一样了,发现全局变量变量本身也改变了
总结:全球的作用就是在“函数局部作用域”内声明表示一个全局变量,从而可以在函数内部修改全局变量的值(否则只能访问不能修改),而且函数内部改变的全局变量的值也会改变。
<强> 2,函数局部作用域强>
函数的局部作用域是不能够保存信息的,即在函数内部声明变量在函数调用结束之后函数里面保存的信息就被销毁了,包括函数的参数,如下:
def 有趣的(步骤): num=1 num +=一步 打印(num) i=1 而(i<5): 有趣的(3),#连续调用函数4次,每次输出的值都是4,即3 + 1,这说明每次调用有趣的函数之后,函数内部定义局部变量num就被销毁了, #没有保存下来,说明函数的局部作用域被销毁了。那如果要保存函数的局部变量,怎么办呢?引入“闭包”。 +=1
<强> 3,闭包,装饰器的本质也是闭包强>
“闭包”的本质就是函数的嵌套定义,即在函数内部再定义函数,如下所示。
“闭包”有两种不同的方式,第一种是在函数内部就“直接调用了”;第二种是“返回一个函数名称“。
(1)第一种形式,直接调用
def 制造商(名称): num=100 def func1(体重、身高、年龄): 重量+=1 身高+=1 年龄+=1 打印(名称、体重、身高、年龄) func1(100200300), #在内部就直接调用“内部函数” 制造商(& # 39;飞飞# 39;),#调用外部函数、输出,feifei 101年,201年,301年
(2)第二种形式,返回函数名称
def 制造商(名称): num=100 def func1(体重、身高、年龄): 重量+=1 身高+=1 年龄+=1 打印(名称、体重、身高、年龄) return func1 #此处不直接调用,而是返回函数名称(Python中一切皆对象) 制造商=制造商(& # 39;飞飞# 39;),#调用包装器 制造商(100200300),#调用内部函数
(3)“闭包”的作用,保存函数的状态信息,使函数的局部变量信息依然可以保存下来,如下:
def 制造商(步骤):#包,装器 num=1 def fun1(): #内部函数 nonlocal num #外地关键字的作用和前面的当地是一样的,如果不使用该关键字,则不能再内部函数改变“外部变量”的值 num=num + step #改变外部变量的值(如果只是访问外部变量,则不需要适用外地) 打印(num) return fun1 #=====================================# j=1 func2=制造商(3),#调用外部包装器 而(j<5): func2(), #调用内部函数4次,输出的结果是,4、7、10、13 j +=1python中闭包的作用