python学习笔记--闭包

来源:互联网 发布:企业私有云软件 编辑:程序博客网 时间:2024/06/05 06:31

一个函数A和一个函数B,其中B函数位于A函数体内部,同时B函数体内调用了B函数之外,A函数之内的其他变量x(包括A中传递过来的参数),此时,x称为B函数的环境变量,B函数和变量x就构成了一个闭包。而函数B是需要返回的,也就是返回函数B,其中在返回的时候,对A参数x的调用也包括在了里面,(有点封闭包含的意思,可能因此叫闭包)。此时A称为闭包函数

eg:

#outer function

def funcB():

y=10

def funcA(x):

   return x+y

return funcA

 

此时funcA构成了一个闭包,而当调用的时候:

Y=20

A=funcB()

Print A(1),则输出11,即使外部定义了y也没用,因为对于funcA来说,其外部环境是funcB。

使用闭包创建了一种泛函数,这种泛函数具有一定的性质,那就是该函数一部分是可以按照一种形式变化,而另一部分是需要按照既定的规则(环境变量中定义的内容)来进行变化的。

比如说上面的例子,就实际上定义了一种情况:返回一个表达式 10+x,其中x可以随便变化,但是10是保持不变的。-------由此想到了另一种闭包的情况,也就是y也是变化的,那么此时y可以设置为funcB的参数,如下所示:

#outer function

def funcB(y):

def funcA(x):

    return x+y

return funcA

此时,确定了一种形式的闭包,也就是必须x,y之间是加法,虽然x,y都可以随便变化,但是加法这种运算不可以变化,不知道是否还可以继续扩展….,我感觉应该还可以继续扩展,毕竟,运算类型也可以以参数的形式传入(不过此时可能需要进行运算类型的判断,这样就隐含了一种情况也就是说,可能运算类型是确定的有限的几种类型,不知道是否可以进一步将运算类型进行扩展,这样就可以自己定义运算类型了,继续扩展…)。

闭包有效减少了传递参数的个数。