1.什么是闭包
1.内部函数对外部函数作用域变量的引用(非全局变量),则称内部函数为闭包。即闭包就是能够读取其他函数内部变量的函数。
2.一个闭包就是你调用了外部函数,外部函数返回内部函数,此时的内部函数就叫做闭包函数。
2.闭包的简单例子
# 普通函数写法
def func():
a=1
b=2
return a+b
# 闭包写法
def sum(a):
def add(b):
# 内部函数称之为闭包函数
return a+b
# 内部函数引用外部函数作用域变量a
return add
# 外部函数返回内部函数
num1=func()
num2=sum(2)
print(type(num1))
print(type(num2))
print(num2(4))
输出为:
阐述一下过程:
print(num2(4))在执行过程中,由于num2=sum(2),所以外部函数作用域变量a=2,num2(4)代表内部函数变量为4。
再看一个简单的计数器例子:
def counter(first=0):
# 计数起点默认为0
cmt=[first]
def add_one():
cnt[0]+=1
return cnt[0]
return add_one
num5=counter(5)
# 计数起点为5
num10=counter(10)
# 计数起点为10
print(num5())
print(num5())
print(num5())
print(num5())
print(num10())
print(num10())
print(num10())
输出为:
3.闭包的lambda函数写法
def a_line(a,b):
return lambda x:a*x+b
line1= a_line(3,5)
line2= a_line(5,10)
print(line1(10))
print(line2(20))
输出为:
4.闭包的作用与缺点
以3中所展示的程序为例:
计算y=a*x+b中,若a和b固定,每次随着x的变化,求出的y值也会不断地变化。但是每次都要代入a和b这两个固定的值。所以引入了闭包的概念。
def a_line(a,b):
def ex(x):
return a*x+b
return ex
line1= a_line(3,5)
print(line1(10))
过程等同于
def a_line(a,b):
a=3
b=5
def ex(x):
return a*x+b
# 在这里x=10
return ex
闭包的作用:
1.可以读取函数内部的变量。
2.让这些变量的值始终保存在内存中。这是因为闭包的执行依赖外部函数中的内存,只有闭包执行完,才会释放变量所占的内存。在工程中,希望变量长期驻扎在内存当中(一般函数执行完毕,变量和参数会被销毁)中的场合可以用到闭包。
闭包的问题:
由于闭包会使得函数中的变量都被保存在内存中,内存消耗大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能会造成内存泄露。
解决方法:在退出函数之前,将不使用的局部变量全部删掉