什么是闭包?
多层函数嵌套,(函数里面还有定义函数,一般是两个),往往内层函数会用到外层函数的变量,把内层函数以及外部函数的变量当成一个特殊的对象,这就是闭包。闭包比面向对象更纯净、更轻量,既有数据又有执行数据的代码;比普通函数功能更强大,不仅有代码
还有数据
;
# 定义一个函数
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) # test()的返回值为内层函数,所有现在ret指向内层函数
# 注意这里的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
此时内层函数用到了外层函数的变量,也可以对其进项修改(不可变类型时)
关键字: nonlocal
nb = 0 # 定义一个全局变量
def test1(num=0): # 默认参数
def test2():
global nb # 在内层函数中修改全局变量时依然使用global声明
nonlocal num # 在内城函数中修改外层函数的变量时使用新的关键字:nomlocal
nb += 2
num += 1
return nb,num
return test2
t1 = test1() # t1指向内层函数
print(t1())
# 运行结果为 (2, 1)
匿名函数、普通函数、闭包、面向对象的区别?
1). 匿名函数能够完成基本的简单功能,传递是这个函数的引用 只有功能。
2). 普通函数能够完成较为复杂的功能,传递是这个函数的引用 只有功能。
3). 闭包能够将较为复杂的功能,传递是这个闭包中的函数
以及数据
,占用资源比较小。
4). 对象能够完成最为复杂的功能,传递是数据
+功能
,但占用大量空间,浪费资源。