什么是闭包

# 定义一个函数
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

闭包---在函数内部再定义一个函数相关推荐

  1. JavaScript中函数作为另一个函数的参数的时候它存在于哪个作用域

    一直对函数作为参数被传递进另外一个函数理解的不是很清除.先看下这段代码吧: function test(fn){var bar = 1;fn(); } var bar = 99; test(funct ...

  2. C和指针之动态内存分配之(编写calloc函数,函数内部使用malloc函数来获取内存)

    1.问题 编写calloc函数,函数内部使用malloc函数来获取内存               2.代码实现 #include <stdio.h> #include <stdli ...

  3. python一个函数调用另一个函数_在Python中将函数作为另一个函数的参数传入并调用的方法...

    在Python中,函数本身也是对象,所以可以将函数作为参数传入另一函数并进行调用 在旧版本中,可以使用apply(function, *args, **kwargs)进行调用,但是在新版本中已经移除, ...

  4. python语言下同一个类下有多个函数,其中一个函数想调用另外一个函数里面的变量怎么调用

    一:问题,同一个类下,有多个函数,其中一个函数想调用另外一个函数里面的变量怎么调用 解决方法:在调用函数里面,初始化一下被调用的函数,然后就可以直接使用被调用函数数里面的变量了 self.被调用函数名 ...

  5. matlab已知函数表达式画函数图像,怎么用matlab画已知函数表达式的一个函数图像?函数比较复杂的……...

    点击查看怎么用matlab画已知函数表达式的一个函数图像?函数比较复杂的--具体信息 答:要具体哦,如果一个自变量,函数图像就是曲线,用plot 如果是2个自变量,函数图像就是曲面了,如f=3*exp ...

  6. 20 Python函数、定义一个函数、参数传递、匿名函数、return语句、变量作用域、

    20Python函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率.你已经知道Python提供了许多内建函数,比如print().但你 ...

  7. c语言虚参传递字符串,c语言中,一个函数作为另一个函数的虚参是什么意思? 先谢了...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 呵呵,这里是用来传递参数的,但是他传递的是一个指针,但是这个指针不是指向一个值的地址.而是指向一个函数的首地址,这个函数是什么格式呢?就由申明的时候一起给 ...

  8. excel函数手册_一个函数高手的成长之路

    作者 | Jodie 秋叶Excel训练营优秀学员 早上跑步听樊登读书会,讲到家长如何培养孩子的社交能力,有一个例子非常好. 你的孩子因为一个玩具,和其他的小朋友争吵起来了,你会怎么处理呢? 大部分家 ...

  9. 在vue开发中会遇到methods方法里有一个函数嵌套另一个函数,最内层函数this取不到data数据,该怎么解决?

    一,问题 在vue的methods方法中两个函数互相嵌套,最内层函数this取不到data数据 二,原因 this的指向问题 三,解决方法 (1)给最外层函数this重新赋值给一个变量 methods ...

最新文章

  1. IE的box模型显示bug
  2. MySQL 自增ID
  3. C++实现CString和string的互相转换
  4. 震惊!原来Android OpenGL ES可以这样用,实现 (水波纹)涟漪效果超惊艳!
  5. 中小型互联网公司微服务实践-经验和教训
  6. Python(字符串,列表,元组,字典)
  7. JAVA 常用框架和工具
  8. [vue-element] ElementUI怎么修改组件的默认样式?
  9. Sublime Text 3 详细安装教程
  10. (转)OGNL与值栈
  11. SpringBoot整合freemarker中自定义标签获取字典表的数据
  12. 前端裁剪头像框_不懂技术和工艺,当心高功率激光焊接头“热”过头
  13. JAVA中修改顺序表中的元素_在Java中修改列表的每个项目
  14. [NOIP2000]方格取数
  15. BCB使用线程删除目录中的图片
  16. xcode 4 配置svn问题
  17. mysql连17张表_mysql连表查询
  18. 计算机组成原理讲义 微盘,计算机组成原理课件.pdf
  19. 程序员软件工程常用的画图软件推荐
  20. 基于Zigbee的智能家居系统

热门文章

  1. 浅谈如何学习linux
  2. centos uwsgi自动调用python2环境,指定uwsgi调用版本
  3. zabbix-02-CentOS7.4安装zabbix4.0
  4. Mysql导入excel数据,解决某些特殊字符乱码问题
  5. 关于.c和.h 和定义变量的问题
  6. MORMOT数据库连接池
  7. Android4.2.2的Stagefright维护编解码器的数据流
  8. Mutual and feedback(互评与反馈)
  9. 数学图形(1.35)Kappa curve
  10. delphi 的一些备忘