Python 闭包 与 装饰器【vnsc5858威尼斯城官网】

时间:2019-05-11 09:50来源:计算机教程
闭包的概念:         闭包(Closure)是词法闭包(LexicalClosure)的简称,是函数式编程的重要语法结构。如果一个函数里定义了一个内部函数,这个函数引用了外部函数的相关参数或变量,

闭包的概念:

vnsc5858威尼斯城官网 1

        闭包(Closure)是词法闭包(Lexical Closure)的简称,是函数式编程的重要语法结构。如果一个函数里定义了一个内部函数,这个函数引用了外部函数的相关参数或变量,外部函数最终把这个内部函数返回了,那么这个内部函数被称为闭包。举个例子:

运行结果如下:

def func(x):
    def inner(y):
        return x   y
    return inner

vnsc5858威尼斯城官网 2

  上述例子中,在函数func中定义了一个inner函数,inner函数访问外部函数func的(参数x)变量,并且把inner函数作为返回值返回给func函数,inner函数就是闭包。运行下述代码:

闭包的定义:在函数内部再定义一个函数,并且这个函数用到了外边函数的变量,那么将这个函数以及用到的一些变量称之为闭包

f = func(2)
print(f)
print(f(8))
print(func(2)(8))

运行结果
<function func.<locals>.inner at 0x0000000006B4F158>
10
10

1.闭包似优化了变量,原来需要类对象完成的工作,闭包也可以完成

  从结果中可以看到f是函数inner,而不是func,因为return返回的是inner函数,并且此时f函数包含了来自外部函数func的参数2,f函数实际表达式为 def inner(y):return 2 y,当运行f(8)时,结果为 2 8 = 10。

2.由于闭包引用了外部函数的局部变量,则外部函数的局部变量没有及时释放,消耗内存

闭包的作用: 


  闭包在运行时可以有多个实例,不同的引用环境和相同的函数组合可以产生不同的实例,这一点有点类似于面向对象中的类,其作用都是减少重复代码和提高功能的可扩展性。以下介绍两种闭包主要的用途:


  (1)即使生成闭包的环境已经释放,闭包仍然存在,传给闭包的变量也不会被释放,根据这个特性可以改变外部作用域的局部变量来实现不同的功能,比如:现在有一组数据,既要计算每个数据的二次方,又要计算每个数据的三次方。示例如下:

装饰器的定义:装饰器,功能就是在运行原来功能基础上,加上一些其它功能,比如权限的验证,比如日志的记录等等。不修改原来的代码,进行功能的扩展。

from math import pow

data = [1,2,3,4,5,6]

def get_result(n):
    def do_pow(x):
        return pow(x,n)
    return do_pow

pow_2 = get_result(2)
pow_3 = get_result(3)

for i in data:
    pow_2(i)
    pow_3(i)

比如java中的动态代理,python的注解装饰器

其实python的装饰器,是修改了代码

   (2)装饰函数。如需求:计算函数的运行时间。实现计算一个函数的运行时间只需在其内部添加代码即可,但当需要计算多个函数时,需要重复在其内部修改代码,重复性工作量大,且耦合度高。要解决此问题可以使用装饰器。示例如下:

例子一:

vnsc5858威尼斯城官网 3

@w1 内部会执行以下操作

执行w1函数 ,并将 @w1 下面的函数名作为w1函数的参数,即:@w1 等价于 w1(f1) 所以,内部就会去执行。   

w1的返回值;将执行完的w1函数返回值 赋值 给@w1下面的函数的函数名f1 即 将w1的返回值再重新赋值给 f1  ,即  f1()=inner()

先将f1赋值给参数,inner赋值给f1,这样f1( )调用的就是inner( ),inner的返回值就是func,func( )调用的就是外部的这个函数。

编辑:计算机教程 本文来源:Python 闭包 与 装饰器【vnsc5858威尼斯城官网】

关键词:

  • 上一篇:没有了
  • 下一篇:没有了