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')

猜你喜欢

转载自blog.csdn.net/xiaomage1996/article/details/80656794