Python 闭包和装饰器

闭包

概念:内部函数对外部函数作用域里变量的引用

  • 例子

    def fun():#外部函数
    a = 1#外部函数作用域里的变量
    print('this is func')
    def func1(num):#内部函数也就是闭包函数
    print('this is func1')
    print(num + a)
    return func1

    var = fun() #此时的 var = func1
    var(3)
    #结果
    this is func
    this is func1
    4

闭包存在的意义:

1.闭包内的闭包函数私有化了变量
2.完成了数据的封装,类似于面向对象

  • 再来看个例子

    mylist = [1,2,3,4,5]

    def func(obj):
    print('func:',obj)
    def func1():
    obj[0] += 1
    print('func1:',obj)
    return func1

    var = func(mylist)
    var()
    var()
    var()

    结果:

    func:[1,2,3,4,5]
    func1:[2,2,3,4,5]
    func1:[3,2,3,4,5]
    func1:[4,2,3,4,5]

装饰器(也叫做语法糖)

概念:外部函数传入被装饰函数名,内部函数返回装饰函数名。不影响原有函数的功能,还能够添加新的功能。

  • 例子

    def fun1(func): #外部闭包函数的参数是被装饰的函数对象
    def fun2():
    print('aaabbb')
    return func()#返回的是外部函数接收的被装饰函数的调用,也就是返回函数的调用
    return fun2 #这个是返回函数对象

    @fun1
    def myprint(): #myprint传入func
    print('我是myprint')

    myprint()
    #结果
    aaabbb
    我是myprint

  • 过程解析

1.调用myprint ---> 识别到语法糖。

2.将myprint传入func --->也就是 fun1(myprint)() //后面这个括号是语法糖的效果

3.由于遇到return fun2 所以fun1(myprint)()就是 fun2()

4.执行fun2()方法,打印'aaabbb',返回func()

5.前面说过,myprint当做参数传递过去给func,所以func() = myprint()

6.所以执行方法myprint(),打印'我是myprint'

  • 再来看个例子

    def fun1(func):
    def fun2(x,y):
    print(x,y)
    x += 3
    y += 3
    return func(x,y)
    return fun2

    @fun1
    def mysum(a,b): #a = a + 5 b同理
    print(a+b)

    mysum(1,1)
    #结果
    1 1
    8

被装饰的函数带参数,只需要在最内部函数传入参数即可。

posted @ 2019-04-05 19:20  苏黎世的从前  阅读(346)  评论(0)    收藏  举报