Day20 装饰器

###装饰器

本质就是函数,为其他函数添加附加功能

原则:

1.不修改被修饰函数的源代码

2.不修改被修饰函数的调用方式

装饰器=高阶函数+函数嵌套+闭包

高阶函数定义:

1.函数接收的参数是一个函数名

2.函数的返回值是一个函数名

3.满足上述条件任意一个,都可称之为高阶函数

装饰器的架子:

def timmer(func):

      def wrapper():

            func()

      return wrapper

@timmer 就相当于 test=timmer(test)#放在要修饰的函数前

timmer为已知装饰器

执行test()即执行wrapper()和func()

装饰器加返回值:

def timmer(func):

      def wrapper():

            res=func()

            return res #此处返回被装饰函数的返回值

      return wrapper

加参数

def timmer(func):

      def wrapper(*args,**kwargs):

            res=func(*args,**kwargs)

            return res 

      return wrapper

*args 用来将参数打包成tuple给函数体调用

**kwargs 打包关键字参数成dict给函数体调用

注意:参数arg、*args、**kwargs三个参数的位置必须是一定的。必须是(arg,*args,**kwargs)这个顺序,否则程序会报错。

test1(1,2,3,4,name=3)等同于test1(*(1,2,3,4),**{‘name’:’alex’}

装饰器流程

def timmer(func):

      def wrapper(*args,**kwargs):

            pass ‘’’加装饰器的功能’’’

            res=func(*args,**kwargs)

            return res 

      return wrapper

@timmer

def test():

      pass

test() #此处为return返回wrapper,test()相当于wrapper所以流程调用wrapper()函数

###查看装饰器流程

debug

###示例添加认证功能

def auth_func(func):

    def wrapper(*args,**kwargs):

        username = input("username").strip()

        passwd = input("passwd").strip()

        if username == "xyy" and passwd == '123':

            res = func(*args,**kwargs)

            return res  # 此处返回被装饰函数的返回值

        else:

            print("用户名或密码错误")

    return wrapper

@auth_func

def index():

    print("welcome to pk")

    return 345

index()

###装饰器带参数

###解压序列

a,b.c = (1,2,3)

a,b,c = ‘hel’

li = [1,4,6,8,4,8,3,9,4,89,453,7,83,4]

a,*_,c = li #取li中第一个和最后一个值

a,*d, c = li #则d为[4,6,8,4,8,3,9,4,89,453,7,83]

a, c =(1,4)

a, b = b, a #交换a, b的值

strip() 用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列

匿名函数执行完一次就不会在内存中出现

交 &

并 |

差 -

异或 ^

在列表中插入元素, list.insert(位置,元素)或list[位置:位置]=[元素,元素……]

list[0:0]=[‘xyy’]在0位置插入,冒号前后位置相同时,在原列表指定位置前插入指定元素

原文地址:https://www.cnblogs.com/xuwinwin/p/11340178.html