• 函数的闭包


          闭包

    学闭包之前,要记住这么一句话,名称空间与作用域,(作用域关系在函数定义阶段时就已经固定死了,与调用位置无关)

    1、闭指的是函数是一个内部函数

    2、包指的是:指的是该函数包含对外部作用域(非全局作用域)名字的引用。

    案例(1):

    def outter():

      x=1

      def inner():

        print(x)

         return inner

    f = outter()

    f()

    案例(2)

    def outter(x)

      def inner()

        print(x)

      return inner

    f = outter()

    f()

                                                                                   装饰器

    1、什么是装饰器

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

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

    就目前的知识来看:

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

    2、为什么要用装饰器

         两大原则:

        (1) 不修改原代码

         (2)不改变原来的调用

    软件的维护应该遵循开发封闭原则

    开放封闭原则指的是:

    软件一旦上线运行后对修改源代码是封闭的,对扩展功能的是开发的。

    重点:装饰器是闭包和函数作用域、函数对象的综合实践。

    案例(1)

    import time
    
    
    def index():
        print('welcome to index')
        time.sleep(3)
    
    
    def decorator(func):
        '''
        装饰的外层函数      
        :param func: 
        :return: wrapper 的内存地址
        '''
        def wrapper():
            '''
            被装饰的函数
            :return: 
            '''
            #当前时间戳
            start = time.time()
            #原函数》》指向index
            func()
            stop = time.time()
            print('the run is %s'%(stop-start))
        #返回函数名,打破层级限制    
        return wrapper   
    
    index = decorator(index)
    index()
    

    案例(2)(如果装饰器有返回值怎么办)

    import time
    
    
    def index():
        print('welcome to index')
        time.sleep(3)
        return 123456
    
    
    def decorator(func):
        '''
        装饰的外层函数
        :param func:
        :return: wrapper 的内存地址
        '''
        def wrapper():
            '''
            被装饰的函数
            :return:
            '''
            #当前时间戳
            start = time.time()
            #原函数》》指向index
            res = func()
            stop = time.time()
            print('the run is %s'%(stop-start))
            return res
        #返回函数名,打破层级限制
        return wrapper
    #这里的index不是源函数index()
    #decorator执行的是wrapper函数
    index = decorator(index)
    res = index()
    print(res)
    

      

    案例(3)(带参数的函数)

    import time
    
    
    def index(name):
        print('welcome  %s to index page'%name)
        time.sleep(3)
        return 123456
    
    
    def decorator(func):
        '''
        装饰的外层函数
        :param func:
        :return: wrapper 的内存地址
        '''
        
        #这里使用*args,**kwargs的好处就是可以传参数,可以不传参数
        def wrapper(*args,**kwargs):
            '''
            被装饰的函数
            :return:
            '''
            #当前时间戳
            start = time.time()
            #原函数》》指向index
            res = func(*args,**kwargs)
            stop = time.time()
            print('the run is %s'%(stop-start))
            return res
        #返回函数名,打破层级限制
        return wrapper
    #这里的index不是源函数index()
    #decorator执行的是wrapper函数
    index = decorator(index)
    res = index('alex')
    print(res)
    

    案例(5)(python装饰器)

    import time


    def decorator(func):
    '''
    装饰的外层函数
    :param func:
    :return: wrapper 的内存地址
    '''

    #这里使用*args,**kwargs的好处就是可以传参数,可以不传参数
    def wrapper(*args,**kwargs):
    '''
    被装饰的函数
    :return:
    '''
    #当前时间戳
    start = time.time()
    #原函数》》指向index
    res = func(*args,**kwargs)
    stop = time.time()
    print('the run is %s'%(stop-start))
    return res
    #返回函数名,打破层级限制
    return wrapper


    @decorator #index=decorator(index)
    def index(name):
    print('welcome %s to index page'%name)
    time.sleep(3)
    return 123456
    #index()调用wrapper函数
    index('egon')

      

  • 相关阅读:
    【Java123】enum枚举及其应用
    sql查询优化_慢查询
    9.4 如何实现属性可修改的函数装饰器?
    9.2 如何为被装饰的函数保存元数据?
    python的如何通过实例方法名字的字符串调用方法?
    9.1 如何使用函数装饰器 用装饰器解决重复计算问题
    asyncio 笔记
    python笔记截图
    list绑定
    表单数据交互
  • 原文地址:https://www.cnblogs.com/wuheng-123/p/9168919.html
Copyright © 2020-2023  润新知