内嵌函数和闭包
来源:互联网 发布:网络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
- 内嵌函数和闭包
- python-内嵌函数和闭包
- 内嵌函数和闭包
- 020:函数:内嵌函数和闭包
- Python-16 函数:内嵌函数和闭包
- Js内嵌函数与闭包
- FishC笔记—20 讲 函数:内嵌函数和闭包
- python基础学习之函数(2)-内嵌函数和闭包
- Python:函数3——内嵌函数和闭包
- 零基础入门学习Python(11):内嵌函数、闭包和变量作用域
- 【Python基础】--字符串str/序列/全局标志位/全局变量/内嵌函数和闭包
- 内部类和闭包
- Python -- 内嵌函数 & closure(闭包) 浅析
- 函数和闭包
- 函数和函数闭包
- Java 内部类和闭包
- 原来 JS 也支持跟 Lua 语意一样的内嵌函数的闭包概念
- 8.局部变量/全局变量global/内嵌函数/闭包nonlocal
- 第四章 Backbonejs中的Router实践
- 随想录(强大的kprobe)
- OpenStack虚拟机HA建议
- 如何查看项目使用的Eclipse版本和Jdk的版本
- OpenGL学习(hello)
- 内嵌函数和闭包
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第13章节--使用业务连接服务创建业务线解决方案 创建启用BCS的业务解决方案
- [LeetCode OJ]Merge Two Sorted Lists
- WebService
- IOS8 模拟器的配置文件目录
- error: linker command failed with exit code 1 (use -v to see invocation)
- BEGINNING SHAREPOINT® 2013 DEVELOPMENT 第13章节--使用业务连接服务创建业务线解决方案 总结
- 【递归算法】人脑理解递归
- android进阶学习