zoukankan      html  css  js  c++  java
  • python之闭包函数和装饰器

    1.闭包函数

    作用域的关系:

                作用域关系在函数定义阶段时就固定死了,与调用位置无关

                即:在任意位置调用函数都需要跑到定义函数时寻找作用域关系

    闭包函数:

    闭指的是:该函数是一个内部函数

    包指的是:指的是该函数包含对外部作用域(非全局作用域)名字的引用==(即形参变量名的赋值引用)

    给函数传值有两种方式:

    方式一:       

                使用参数的形式

    def inner(x):

                print(x)

    inner(x)

    方式二:

                    包给函数

    def outter(x):                  形参x=1  赋值

             def inner():

                     print(x)

             return inner

    f=outter(1)                    ourret(1)函数最后运行结果是inner的内存地址,赋值给f  

    f()                                     f()直接调用 inner函数  

        

    2.装饰器

            1.什么是装饰器

            器指的是工具,而在程序只能的函数就具备某一功能的工具

            装饰指的是为被装饰对象添加额外功能

            装饰器模板:

                            

    def timmer(func):
        def wrapper(*args,**kwargs):
    
            res=func(*args,**kwargs)
            return res
        return wrapper
    #装饰器语法糖
    # 在被装饰对象正上方,并且是单独一行写上@装饰器名

           

           就目前来看:

                    定义装饰器就是定义一个函数,只不过该函数的功能是用来为 其他函数添加额外的功能

           其实:

            装饰器本身可以是任意可调用的对象

            被装饰的对象也可以是任意可调用的对象

        软件的维护遵循开放封闭原则    

        开放封闭原则指的是:软件一旦上线运行后对修改源代码是封闭的,对扩展功能的是开放的。这个时候就用到装饰器了

          装饰器的实现必须遵循两大原则:

            1.不修改被装饰对象的源代码

            2.不修改被装饰对象的调用方式

            装饰器就是在遵循1和2原则的前提下为呗装饰对象添加新功能

    import time
    def index():
        print('welcom to index')
        time.sleep(3)
    
    def timmer(func):
            #最原始func=index
        def wrapper():
            start=time.time()
            func()
            stop=time.time()
            print('run time is %s'(stop-start))
        return wrapper
    index=timmer(index)     #index=wrapper函数的内存地址
    index()
    

         装饰器中需要传参数的话,这时就需要用到之前的可变长参数的应用

            *args,**keargs          函数形参会把参数原封不动转接给内部函数用

    import time
    def index():
        print('welcome to index')
        time.sleep(3)
        return 123
    
    
    def home(name):
        print('welcome %s to name'%(name))
    
    
    def timmer(func):
        def wepper(*args, **kwargs):
            start = time.time()
            res = func(*args, **kwargs)
            stop = time.time()
            print('run time is %s' % (stop - start))
            return res
        return wepper
    
    
    index = timmer(index)
    home = timmer(home)
    index()
    home('egon')

    装饰器语法糖:

        在被装饰对象的上方,并且是单独一行写上@装饰器名

     import time
    # def timmer(func):
    #     #func=最原始的index
    #     def wrapper(*args,**kwargs):
    #         start=time.time()
    #         res=func(*args,**kwargs)
    #         stop=time.time()
    #         print('run time is %s' %(stop - start))
    #         return res
    #     return wrapper

    #
    # @timmer                                  # index=timmer(index)
    # def index():
    #     print('welcome to index')
    #     time.sleep(3)
    #     return 123
    #
    # @timmer                                # home=timmer(home)   
    # def home(name):
    #     print('welcome %s to home page' %name)
    #     time.sleep(2)
    #
    # res=index()
    # home('egon')

  • 相关阅读:
    python文件读取
    python字符串的使用
    需求验证实现
    面向对象思想——面向对象设计原则
    java面试问题整理-垃圾回收
    Java集合类学习-LinkedList, ArrayList, Stack, Queue, Vector
    Java集合类源码学习- Iterabel<T>,Colection<E>,AbstractCollection<E>
    EMF学习,为了实现可扩展可自定义的模型验证
    EMF学习,为了实现可扩展可自定义的模型验证
    Google 云计算中的 GFS 体系结构
  • 原文地址:https://www.cnblogs.com/Marcki/p/10111964.html
Copyright © 2011-2022 走看看