python闭包的意思,用法,装饰器的简单应用

上一篇 / 下一篇  2019-12-12 10:39:43 / 个人分类:python笔记

简单讲解闭包的写法和应用,在这之前,先声明,你定义的任意一个函数都可以作为其他函数的参数。就像下面这段代码的参数func,接收的参数就是一个函数名,在函数体内部使用了func()调用执行函数。

请看下面的代码,注意标红的位置,猜猜看结果

def a(func):

        def inner():

                print("验证中")

               func()

        returninner

 

def f2():

        print("--------2-----")

f2 = a(f2)

f2()

结果是先打印:验证中,然后打印了--------2-----,如下:

验证中

--------2------

先讲一下闭包的意思,就是像第一个函数a,有一个参数func(可以是任意参数),然后a函数体的内部又定义了一个函数,这个函数可以有参数可以没有,函数内部用到了外部函数a的参数,此时就称为闭包。这种应用场景一般是在外部的函数的参数不经常变化,但是里面的参数经常需要变的时候,比如:

def test(a,b):

        def inner(x):

                return a*x+b

        returninner

上面这个例子,ab是两个常量,x经常变化,就可以这样写代码,调用的时候:

c = test(2,3)          #只需要调用一次,下面可以多次使用

inner(5)-------------------------à结果就是2*5+3

inner(6) -------------------------à结果就是2*6+3

……

 

 

然后我讲解一下为什么上面会出现那个的结果,讲一下程序执行的步骤:

1.      先执行def a(func):这一行,是一个定义函数,不做操作

2.      接着往下,执行def f1():这行,仍然不做操作

3.      接着往下,执行def f2():这行,仍然不做操作

4.      再往下执行一直到f2=a(f2),执行这句话的时候,先执行右侧,a(f2)即调用函数a,参数为f2f2是一个函数名(注意哦,f2后面没有(),意思就是说这里只是把f2这个引用传递给了函数a的参数func),此时func指向了f2的函数体。进入到a函数里面,执行def inner(),这句话仍然不做操作,然后执行return inner(这里也要注意inner后面没有()),执行return这句话就是把inner返回给了等号左边的f2变量,可以理解为f2=inner

5.      f2(),这句话,第4步的时候把inner的引用给了f2,意味着f2现在指向的是inner这个函数体,也就是执行inner函数了

6.      Inner函数第一句打印一句话,不必说。第二句func(),还记得func指向哪里吗?注意第4步的执行右半部分的时候,把f2这个函数体的引用给了func所以此时的func()就是执行f2函数体的内容啦

 

上面这种情况呢,就是假如说你执行f1()f2()等等函数的时候需要先执行一些一样的操作,本例中是print("验证中"),就可以这样用

 

上面说的理解了以后,那装饰器就容易理解了:

def a(func):

        def inner():

                print("验证中")

               func()

        returninner

 

def f1():

        print("--------1-----")

 #这句话就是使用装饰器,等同于 f2 = a(f2),装饰器也可以有多个,依次往上写多个@就行(a的后面不要加括号

@a        

def f2():

        print("--------2-----")

f2()

 

如果你代码有大量重复的,就可以这样使用装饰器,把重复的代码放到a函数体的位置,需要用到重复代码的地方用a装饰一下。比如打印log等


TAG: python Python 装饰器 闭包

 

评分:0

我来说两句

日历

« 2024-04-16  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 4523
  • 日志数: 6
  • 建立时间: 2018-11-29
  • 更新时间: 2019-12-12

RSS订阅

Open Toolbar