内嵌函数和闭包

来源:互联网 发布:网络mg老虎机技巧 编辑:程序博客网 时间:2024/06/06 09:07

1、python里面定义函数和c里面一样,也存在函数的嵌套定义,eg:

def fun1(x):        def fun2(y):               z=x*y               return z         return fun2
则在函数调用的时候需要传递2个实参,分别给x,y 且形式为:result=fun1(a)(b)

        2、由于在python函数定义的时候,出现局部变量和全局变量的名称相同的时候,内存自动分配一个和外部变量相同的名称来存储局部变量的值,所以,在函数内部,屏蔽全局变量,所以当出现如下情况:

         

def funx(x):       a=100       z=x*a       return za=90re=funx(0.8)print (a)

        如果想在函数中修改全局变量 X,需要在函数里面做声明:global X    

 a的返回值仍然是90

      3、当在函数嵌套的时候,在嵌套函数中需要用到上级函数(外部函数)的变量的时候若形式为:  

def fun1(x):        a=5        def fun2(y):               a=a+x+y               return a         return fun2

函数会报错:变量 a 在设定之前被引用了,原因是上级函数的局部变量值被改变, 
利用 nonlocal 可以用来声明该变量不是局部变量 解决问题(即可以修改外部函数的局部变量)

<pre name="code" class="python">def fun1(x):        a=5        def fun2(y):               nonlocal a               a=a+x+y               return a        return fun2


调用嵌套函数re=fun1(1)(2) 可得到结果 8(a+x+y)

故:当在嵌套函数中,对上级函数局部变量或者全局变量a,在该级函数中,若直接赋值操作则系统会重新分配地址给新的另一个局部变量a(同名不同值),若对a进行变量操作,则系统报错 (没有对a进行赋值而引用)

4、对于嵌套函数,可以曲线形式调用:

 如上fun1() 函数,可以令temp=fun1(1)--->得到的<function fun1.<locals>.fun2 at 0x02370420>,即得到的中间变量 temp 的类型是‘function’,当再次调用内部子函数的时候得到最终结果:re=temp(2)---->8:

def fun1(x):        a=5        def fun2(y):               nonlocal a               a=a+x+y               return a        return fun2temp=fun1(1)temp<function fun1.<locals>.fun2 at 0x02370420>type(temp)<class 'function'>result=temp(2)
result8
注:若对于上面的函数,得到temp=fun1(1), 执行result=temp(2)后,temp并没有被释放掉,还是一个函数类型,且为fun1(1)所以,只要temp没有被重新赋值,就不会改变,这就是闭包,所以:

print(temp(2))11print(temp(2))14
即在原来的函数基础上,依次迭代执行fun2, (闭包)



0 0
原创粉丝点击