Python学习之路学习之路——函数的闭包与装饰器函数的闭包与装饰器
很多初次接触到python的小伙伴可能并不理解闭包是什么,为什么有闭包,闭包有什么用,那么今天博主就从这三点来为大家讲解一下python的闭包
一、闭包是什么一、闭包是什么
官方定义:
在计算机科学中,闭包(英语:Closure),又称词法闭包(Lexical Closure)或函数闭包(function closures),是引用了自由变量的函数。这个被引用的自由变
量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,有另一种说法认为闭包是由函数和与其相关的引用环境组合而成的实体。闭包在运行
时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例。
我的理解
在一个函数的内部嵌套了一个函数,并且这个函数引用了外部函数中的局部变量,那么这个内部函数就称为闭包
Python 中的闭包
Python 中闭包的实现得益于Python是一门面向对象编程的语言,函数在Python中也不例外,在Python中函数也是作为对象(函数对象)的方式进行存在
下面我们来看一个例子你就清楚了:
在这里我们首先定义了一个函数,然后我们使用Python中的内部方法(type),type(args)的作用是查看传入参数args的类型,我们可以看到func的类型就是一个函数对象
我们都知道函数是可以返回值的,所以在Python中函数对象也可以作为值进行返回,这样就为闭包的实现提供了基础.
下面我们来看一下Python的闭包实现过程:
在这里我们首先定义了一个名为outer的函数,然后在这个函数的内部我们又定义了一个名为”out_value”的变量,然后又在函数的内部定义了一个名为inner的内部函
数,在inner函数内我们又引用了外部函数(outer)的变量,这样我们就称inner为闭包
我们再来看看闭包的一些属性
我们调用并执行outer函数并将其返回值赋给变量f,我们通过打印可以看到,变量f的类型为函数类型,因为是函数对象所以f必然是具有 ‘_call_’ 属性的(就是函数后面的
() 也就是将函数执行) 然后我们再来看f变量的名称,可以看到f是名为inner的函数对象,为什么会这样是因为,在outer函数执行完毕后,在其返回的时候我们将在outer函
数内部定义的inner函数对象进行返回了,所以f变量的名称为inner
我们既然了解了python中闭包的基本实现方法,那我们再来多看几个例子:
上面这个例子大家在没有看答案的情况下,大家猜一下结果会是怎样呢,可能有部分小伙伴已经看透了这其中的猫腻,那部分没有看出的小伙伴心中的结果是不是
0
1
2
这样呢? 那我这里就不卖关子了,其实上面的这种结果是错误的,正确的结果是:
2
2
2
为什么会这样呢?
那是因为在outer函数内,inner相对于outer来说其只是内部定义的一个函数,变量 i 的作用域还是在outer中,所以
评论0
最新资源