闭包---在函数内部再定义一个函数
什么是闭包
# 定义一个函数
def test(number):# 在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包def test_in(number_in):print("in test_in 函数, number_in is %d" % number_in)return number+number_in# 其实这里返回的就是闭包的结果return test_in# 给test函数赋值,这个20就是给参数number
ret = test(20)# 注意这里的100其实给参数number_in
print(ret(100))#注 意这里的200其实给参数number_in
print(ret(200))
运行结果:
in test_in 函数, number_in is 100
120in test_in 函数, number_in is 200
220
看一个闭包的实际例子:
def line_conf(a, b):def line(x):return a*x + breturn lineline1 = line_conf(1, 1)
line2 = line_conf(4, 5)
print(line1(5))
print(line2(5))
这个例子中,函数line与变量a,b构成闭包。在创建闭包的时候,我们通过line_conf的参数a,b说明了这两个变量的取值,这样,我们就确定了函数的最终形式(y = x + 1和y = 4x + 5)。我们只需要变换参数a,b,就可以获得不同的直线表达函数。由此,我们可以看到,闭包也具有提高代码可复用性的作用。
如果没有闭包,我们需要每次创建直线函数的时候同时说明a,b,x。这样,我们就需要更多的参数传递,也减少了代码的可移植性。
注意点:
由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存
修改外部函数中的变量
python3的方法
def counter(start=0):def incr():nonlocal startstart += 1return startreturn incrc1 = counter(5)
print(c1())
print(c1())c2 = counter(50)
print(c2())
print(c2())print(c1())
print(c1())print(c2())
print(c2())
python2的方法
def counter(start=0):count=[start]def incr():count[0] += 1return count[0]return incrc1 = closeure.counter(5)
print(c1()) # 6
print(c1()) # 7
c2 = closeure.counter(100)
print(c2()) # 101
print(c2()) # 102
闭包---在函数内部再定义一个函数相关推荐
- JavaScript中函数作为另一个函数的参数的时候它存在于哪个作用域
一直对函数作为参数被传递进另外一个函数理解的不是很清除.先看下这段代码吧: function test(fn){var bar = 1;fn(); } var bar = 99; test(funct ...
- C和指针之动态内存分配之(编写calloc函数,函数内部使用malloc函数来获取内存)
1.问题 编写calloc函数,函数内部使用malloc函数来获取内存 2.代码实现 #include <stdio.h> #include <stdli ...
- python一个函数调用另一个函数_在Python中将函数作为另一个函数的参数传入并调用的方法...
在Python中,函数本身也是对象,所以可以将函数作为参数传入另一函数并进行调用 在旧版本中,可以使用apply(function, *args, **kwargs)进行调用,但是在新版本中已经移除, ...
- python语言下同一个类下有多个函数,其中一个函数想调用另外一个函数里面的变量怎么调用
一:问题,同一个类下,有多个函数,其中一个函数想调用另外一个函数里面的变量怎么调用 解决方法:在调用函数里面,初始化一下被调用的函数,然后就可以直接使用被调用函数数里面的变量了 self.被调用函数名 ...
- matlab已知函数表达式画函数图像,怎么用matlab画已知函数表达式的一个函数图像?函数比较复杂的……...
点击查看怎么用matlab画已知函数表达式的一个函数图像?函数比较复杂的--具体信息 答:要具体哦,如果一个自变量,函数图像就是曲线,用plot 如果是2个自变量,函数图像就是曲面了,如f=3*exp ...
- 20 Python函数、定义一个函数、参数传递、匿名函数、return语句、变量作用域、
20Python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你 ...
- c语言虚参传递字符串,c语言中,一个函数作为另一个函数的虚参是什么意思? 先谢了...
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 呵呵,这里是用来传递参数的,但是他传递的是一个指针,但是这个指针不是指向一个值的地址.而是指向一个函数的首地址,这个函数是什么格式呢?就由申明的时候一起给 ...
- excel函数手册_一个函数高手的成长之路
作者 | Jodie 秋叶Excel训练营优秀学员 早上跑步听樊登读书会,讲到家长如何培养孩子的社交能力,有一个例子非常好. 你的孩子因为一个玩具,和其他的小朋友争吵起来了,你会怎么处理呢? 大部分家 ...
- 在vue开发中会遇到methods方法里有一个函数嵌套另一个函数,最内层函数this取不到data数据,该怎么解决?
一,问题 在vue的methods方法中两个函数互相嵌套,最内层函数this取不到data数据 二,原因 this的指向问题 三,解决方法 (1)给最外层函数this重新赋值给一个变量 methods ...
最新文章
- IE的box模型显示bug
- MySQL 自增ID
- C++实现CString和string的互相转换
- 震惊!原来Android OpenGL ES可以这样用,实现 (水波纹)涟漪效果超惊艳!
- 中小型互联网公司微服务实践-经验和教训
- Python(字符串,列表,元组,字典)
- JAVA 常用框架和工具
- [vue-element] ElementUI怎么修改组件的默认样式?
- Sublime Text 3 详细安装教程
- (转)OGNL与值栈
- SpringBoot整合freemarker中自定义标签获取字典表的数据
- 前端裁剪头像框_不懂技术和工艺,当心高功率激光焊接头“热”过头
- JAVA中修改顺序表中的元素_在Java中修改列表的每个项目
- [NOIP2000]方格取数
- BCB使用线程删除目录中的图片
- xcode 4 配置svn问题
- mysql连17张表_mysql连表查询
- 计算机组成原理讲义 微盘,计算机组成原理课件.pdf
- 程序员软件工程常用的画图软件推荐
- 基于Zigbee的智能家居系统