内嵌函数和闭包

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 z
a=90
re=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 fun2

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

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值