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位置插入,冒号前后位置相同时,在原列表指定位置前插入指定元素

  • 相关阅读:
    CodeForces 706C Hard problem
    CodeForces 706A Beru-taxi
    CodeForces 706B Interesting drink
    CodeForces 706E Working routine
    CodeForces 706D Vasiliy's Multiset
    CodeForces 703B Mishka and trip
    CodeForces 703C Chris and Road
    POJ 1835 宇航员
    HDU 4907 Task schedule
    HDU 4911 Inversion
  • 原文地址:https://www.cnblogs.com/xuwinwin/p/11340178.html
Copyright © 2011-2022 走看看