参考链接: Python闭包

闭包

1. 函数引用

def test1():

print("--- in test1 func----")

#调用函数

test1()

#引用函数

ret = test1

print(id(ret))

print(id(test1))

#通过引用调用函数

ret()

运行结果:

--- in test1 func----

140212571149040

140212571149040

--- in test1 func----

2. 什么是闭包

#定义一个函数

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

120

in test_in 函数, number_in is 200

220

3. 闭包再理解

内部函数对外部函数作用域里变量的引用(非全局变量),则称内部函数为闭包。

# closure.py

def counter(start=0):

count=[start]

def incr():

count[0] += 1

return count[0]

return incr

启动python解释器

>>>import closeure

>>>c1=closeure.counter(5)

>>>print(c1())

6

>>>print(c1())

7

>>>c2=closeure.counter(100)

>>>print(c2())

101

>>>print(c2())

102

nonlocal访问外部函数的局部变量(python3)

def counter(start=0):

def incr():

nonlocal start

start += 1

return start

return incr

c1 = counter(5)

print(c1())

print(c1())

c2 = counter(50)

print(c2())

print(c2())

print(c1())

print(c1())

print(c2())

print(c2())

4. 看一个闭包的实际例子:

def line_conf(a, b):

def line(x):

return a*x + b

return line

line1 = 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。这样,我们就需要更多的参数传递,也减少了代码的可移植性。

闭包思考:

1.闭包似优化了变量,原来需要类对象完成的工作,闭包也可以完成

2.由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存

[转载] python3 闭包相关推荐

  1. python3 闭包

    python3 闭包 闭包说的是在函数内部定义一个函数,但该函数包含一个对外部变量的引用,该变量引用范围仅限局部变量,不会延伸到全局变量 #!/usr/bin/env python #coding:u ...

  2. [转载] python3.x总复习

    参考链接: Python的string.punctuation python3.x总复习 1. python有六种基本数据类型:数字number,字符串str,列表list,元组tuple,字典dic ...

  3. [转载] python3.6版本生成的python脚本如何打包为可独立执行的exe程序

    参考链接: Python命令行界面编程 如需转载,请注明出处:http://blog.csdn.net/jayloncheng/article/details/77567638 在此,我们使用pyin ...

  4. [转载] python 闭包和装饰器详解

    参考链接: Python中的装饰器 python 闭包,装饰器 一 闭包 如果在一个函数的内部定义了另一个函数,外部的函数叫它外函数,内部的函数叫它内函数. 1 闭包条件 1 在一个外函数中定义了一个 ...

  5. python3闭包通俗解释_Python|闭包、装饰器,简单的实例,通俗的理解

    闭包和装饰器都是属于函数的语法范畴,是在函数定义中以另一个函数做为形参的语法机制. 1 闭包(Closurer) 闭包是定义内部函数的一种语法规则,要理解闭包,请看下面的实例:def outer(t) ...

  6. [转载] Python3网络爬虫

    这篇文章描述了使用python开发最小的网络爬虫的方法和步骤, 以及如何用fiddler来探索浏览器的行为来帮助爬虫的开发. http://www.yiibai.com/python/python3- ...

  7. [转载] Python3十大经典错误及解决办法

    参考链接: Python中的关键字2 ◆ ◆ ◆  ◆ ◆ 接触了很多Python爱好者,有初学者,亦有转行人.不论大家学习Python的目的是什么,总之,学习Python前期写出来的代码不报错就是极 ...

  8. [转载] Python3.X 线程中信号量的使用方法示例

    参考链接: 示例说明Python2.x和Python3.x之间的重要区别 信号量semaphore 是一个变量,控制着对公共资源或者临界区的访问.信号量维护着一个计数器,指定可同时访问资源或者进入临界 ...

  9. [转载] Python3 字典 values() 方法

    参考链接: Python字典values() 描述 Python 字典 values() 方法返回一个迭代器,可以使用 list() 来转换为列表,列表为字典中的所有值. 语法 values()方法语 ...

最新文章

  1. 说说项目从0-1过程中的那点事儿
  2. 13、logging模块
  3. ifstream note
  4. YARN执行作业报错Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out.
  5. 31. 脱壳篇-什么是壳
  6. 四、Python-元组
  7. 代码和mysql服务器编码不一致_PL/SQL Developer教程:解决oracle服务器端和客户端字符编码不一致问题...
  8. 1043 幸运号码 数位DP
  9. 比Magic Leap快一步,HoloLamp做到了裸眼观看全息图
  10. 51单片机驱动TM1638芯片+Proteus仿真
  11. Guitar Pro8版本 吉他绘谱创作乐谱
  12. 【线性代数笔记】幂等矩阵的性质
  13. mongodb每秒写入量_OPPO百万级高并发MongoDB集群性能数十倍提升优化实践
  14. antv/G6自定义边
  15. 【Redis】基础篇
  16. MyEclipse的下载和安装
  17. 爬取全国任意省份天气数据详细步骤
  18. tcp_tw_reuse 为什么默认是关闭的?
  19. 史上最全SD-WAN供应方大盘点(下)
  20. 非常好用的XueTr-驱动开发,底层开发等等的好助手

热门文章

  1. 电脑访问不了部分网站|Internet属性
  2. 计算机系统自带的文字处理程序,如何使用win7系统电脑的内置字符编辑程序
  3. JavaScript文档对象模型DOM节点操作之兄弟节点(4)
  4. 去除内联元素之间的间距
  5. malloc,free 与new delete的区别
  6. 试题2 入门训练 圆的面积
  7. Unity3D基础15:触发器
  8. 数据库安全性概念与自主安全性机制
  9. python机器学习案例系列教程——聚类算法总结
  10. ArrayList使用