函数闭包入门
Posted goophp
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数闭包入门相关的知识,希望对你有一定的参考价值。
函数闭包入门
什么是闭包
闭包是一种特殊的函数,闭包一般由两个函数构成,分别为内函数和外函数,内函数会引用外函数传入的参数,而外函数返回的结果是内函数本身。
比如:
def func_out(a):#外函数
b=10#a,b都是外函数的变量
def func_in(c):#c是内函数的变量
return a+b+c#内函数调用外函数的变量
return func_in #返回内函数本身
>>>m=func_out(1)#此时外函数传入a=1,返回的是m本质上就是func_in函数对象
>>>m(3)#调用func_in()函数,传入func_in函数的参数c=3
14
闭包的条件
- 在一个外函数中定义了一个内函数
- 内函数调用了外函数的参数
- 外函数返回内函数本身
可以看到,闭包一个很大的特点就是内函数在调用外函数的临时变量。在python中,一个函数内部的变量,若没有特别声明为全局变量,都为该函数局部域下的临时变量,当函数执行完,内部的局部变量也会回收释放掉。而上面这个例子的a和b都还没被释放,可以调用,因为外函数尚未执行完,内函数也属于外函数之中。
可以这么理解:
在函数内部可以直接调用全局变量,如:
a=10 #外部全局变量
def func(b):
return a+b
>>>11
因此,在闭包中,外函数的域如果为A,内函数的域为B,那么B是属于A的,或者说A是B的相对全局域,那么内函数中自然可以调用外函数的变量。
几点理解
- 闭包返回的是一个函数对象
def func_out(a):
b=10
def func_in():
return a+b
return func_in
>>>m=func_out(1)
>>>type(m)
<class \\\'function\\\'>
>>>m(1)
12
闭包返回的是内函数,可以看到,调用一个闭包,最后调用的时候都是在内函数实现,而外函数更多是进行了部分变量或其它相关信息的保存和初始化。之后每次调用闭包或者内函数时,这些通用的变量就不用再传进去了。这一点很像一个单函数的类,比如:
class A:
def __init__(self,a,b):
self.a=a
self.b=b
def func(self,c):
return self.a+self.b
>>>m=A(1,10)
>>>m.func(1)
11
上述例子中类所实现的功能就和之前的闭包例子一样。因此很多单方法类可以转换为闭包来实现。
闭包的典型应用
待补充
闭包在实际工程时的应用场景
待补充
以上是关于函数闭包入门的主要内容,如果未能解决你的问题,请参考以下文章