1、python里面定义函数和c里面一样,也存在函数的嵌套定义,eg:
则在函数调用的时候需要传递2个实参,分别给x,y 且形式为:result=fun1(a)(b)def fun1(x): def fun2(y): z=x*y return z return fun2
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)
注:若对于上面的函数,得到temp=fun1(1), 执行result=temp(2)后,temp并没有被释放掉,还是一个函数类型,且为fun1(1)所以,只要temp没有被重新赋值,就不会改变,这就是闭包,所以:result 8
即在原来的函数基础上,依次迭代执行fun2, (闭包)print(temp(2)) 11 print(temp(2)) 14