[转载] python3 闭包
参考链接: 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 闭包相关推荐
- python3 闭包
python3 闭包 闭包说的是在函数内部定义一个函数,但该函数包含一个对外部变量的引用,该变量引用范围仅限局部变量,不会延伸到全局变量 #!/usr/bin/env python #coding:u ...
- [转载] python3.x总复习
参考链接: Python的string.punctuation python3.x总复习 1. python有六种基本数据类型:数字number,字符串str,列表list,元组tuple,字典dic ...
- [转载] python3.6版本生成的python脚本如何打包为可独立执行的exe程序
参考链接: Python命令行界面编程 如需转载,请注明出处:http://blog.csdn.net/jayloncheng/article/details/77567638 在此,我们使用pyin ...
- [转载] python 闭包和装饰器详解
参考链接: Python中的装饰器 python 闭包,装饰器 一 闭包 如果在一个函数的内部定义了另一个函数,外部的函数叫它外函数,内部的函数叫它内函数. 1 闭包条件 1 在一个外函数中定义了一个 ...
- python3闭包通俗解释_Python|闭包、装饰器,简单的实例,通俗的理解
闭包和装饰器都是属于函数的语法范畴,是在函数定义中以另一个函数做为形参的语法机制. 1 闭包(Closurer) 闭包是定义内部函数的一种语法规则,要理解闭包,请看下面的实例:def outer(t) ...
- [转载] Python3网络爬虫
这篇文章描述了使用python开发最小的网络爬虫的方法和步骤, 以及如何用fiddler来探索浏览器的行为来帮助爬虫的开发. http://www.yiibai.com/python/python3- ...
- [转载] Python3十大经典错误及解决办法
参考链接: Python中的关键字2 ◆ ◆ ◆ ◆ ◆ 接触了很多Python爱好者,有初学者,亦有转行人.不论大家学习Python的目的是什么,总之,学习Python前期写出来的代码不报错就是极 ...
- [转载] Python3.X 线程中信号量的使用方法示例
参考链接: 示例说明Python2.x和Python3.x之间的重要区别 信号量semaphore 是一个变量,控制着对公共资源或者临界区的访问.信号量维护着一个计数器,指定可同时访问资源或者进入临界 ...
- [转载] Python3 字典 values() 方法
参考链接: Python字典values() 描述 Python 字典 values() 方法返回一个迭代器,可以使用 list() 来转换为列表,列表为字典中的所有值. 语法 values()方法语 ...
最新文章
- 说说项目从0-1过程中的那点事儿
- 13、logging模块
- ifstream note
- YARN执行作业报错Exceeded MAX_FAILED_UNIQUE_FETCHES; bailing-out.
- 31. 脱壳篇-什么是壳
- 四、Python-元组
- 代码和mysql服务器编码不一致_PL/SQL Developer教程:解决oracle服务器端和客户端字符编码不一致问题...
- 1043 幸运号码 数位DP
- 比Magic Leap快一步,HoloLamp做到了裸眼观看全息图
- 51单片机驱动TM1638芯片+Proteus仿真
- Guitar Pro8版本 吉他绘谱创作乐谱
- 【线性代数笔记】幂等矩阵的性质
- mongodb每秒写入量_OPPO百万级高并发MongoDB集群性能数十倍提升优化实践
- antv/G6自定义边
- 【Redis】基础篇
- MyEclipse的下载和安装
- 爬取全国任意省份天气数据详细步骤
- tcp_tw_reuse 为什么默认是关闭的?
- 史上最全SD-WAN供应方大盘点(下)
- 非常好用的XueTr-驱动开发,底层开发等等的好助手