• CSIC_716_20191112【闭包函数和装饰器】


    闭包函数

    什么是闭包函数:闭包函数是函数嵌套、函数对象、名称空间和作用域的集合体。

    闭包函数必须在函数内部定义,闭包函数可以引用外层函数的名字。

    # _*_ coding: gbk _*_
    # @Author: Wonder
    def outer():
        def inner():
            #代码体
            return inner()
    
    outer() # 调用闭包函数
    

    装饰器

    什么是装饰器:装饰器本身是一个函数,是在不修改其他函数源代码以及调用方式的前提下,给其他函数增加功能的函数。

    装饰器遵循开放闭合原则。即对函数功能的添加是开放的,对函数功能的修改是关闭的。

    为什么要使用装饰器:解决代码冗余问题,提高代码的可拓展性。

    如何使用装饰器:1、编写装饰器,2、调用装饰器。

    1、编写装饰器

    装饰器的基本结构

    def wrappper(func):
        def inner(*args, **kwargs):
            #函数执行前应增加的功能
            res = func(*args,**kwargs)
            #函数执行后应增加的功能
            return res
        return inner

    2、调用装饰器

    def wrappper(func):
        def inner(*args, **kwargs):
            #函数执行前应增加的功能
            res = func(*args,**kwargs)
            #函数执行后应增加的功能
            return res
        return inner
    
    def func1(*args, **kwargs):
        # 函数体代码
        return
    func1 = wrappper(func1)
    func1(0, 1, a=0, b=1)  # 增加装饰器的原函数调用方式没变,源代码也没变
    

      python中还提供了解释器的语法糖结构,注意装饰器一定要写在被装饰对象前面。用@符号+装饰器函数名表示

    def wrappper(func):
        def inner(*args, **kwargs):
            # 函数执行前应增加的功能
            res = func(*args, **kwargs)
            # 函数执行后应增加的功能
            return res
    
        return inner
    
    
    @wrappper
    def func1(*args, **kwargs):
        # 函数体代码
        print('闭包')
        return
    
    
    func1(0, 1, a=0, b=1)  # 增加装饰器的原函数调用方式没变,源代码也没变
    

      

     扩展:两个装饰器的执行过程,注意理解https://blog.csdn.net/xiangxianghehe/article/details/77170585

    # _*_ coding: gbk _*_
    # @Author: Wonder
    def deco1(func):
        print(1)
    
        def wrapper1():
            print(2)
            func()
            print(3)
    
        print(4)
        return wrapper1
    
    
    def deco2(func):
        print(5)
    
        def wrapper2():
            print(6)
            func()
            print(7)
    
        print(8)
        return wrapper2
    
    
    @deco1
    @deco2
    def foo():
        print('foo')
    
    
    foo()

    答案5、8、1、4、2、6、foo、7、3

      

    含参装饰器

  • 相关阅读:
    BZOJ3129/洛谷P3301方程(SDOI2013)容斥原理+扩展Lucas定理
    Dilworth定理
    字符串
    hash
    李超线段树(segment[HEOI2013]-洛谷T4097)
    连通数[JSOI2010]-洛谷T4306
    主席树
    splay
    树链剖分
    受欢迎的奶牛-洛谷2341
  • 原文地址:https://www.cnblogs.com/csic716/p/11842567.html
Copyright © 2020-2023  润新知