zoukankan      html  css  js  c++  java
  • 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位置插入,冒号前后位置相同时,在原列表指定位置前插入指定元素

  • 相关阅读:
    456. 132 Pattern
    496. Next Greater Element I
    503. Next Greater Element II
    341. Flatten Nested List Iterator
    232. Implement Queue using Stacks
    225. Implement Stack using Queues
    208. Implement Trie (Prefix Tree)
    思考--为何早晨型人更容易成功
    Listary的使用
    【运维】虚拟机如何安装CentOS
  • 原文地址:https://www.cnblogs.com/xuwinwin/p/11340178.html
Copyright © 2011-2022 走看看