zoukankan      html  css  js  c++  java
  • day11:装饰器

    1,引子,计算函数的运行时间:

    import time
    
    def func():
        time.sleep(0.01)  # 为了计算运行时间差的时候有值
        print("func")
    
    def timer(f): # 装饰器函数
        def inner():
            start_time = time.time() # 从1970年开始的毫秒数
            f() # 内部函数应用外部函数变量,闭包,被装饰的函数
            end_time = time.time()
            exec_time = start_time - end_time
    
        return inner()

    2,装饰器的作用,不想修改函数的调用方式,但是还想在原来的函数前后添加功能,timer就是一个装饰器函数,只是对一些函数有一些装饰作用

    3,语法糖,@装饰器函数名

    import time  #获取当前时间
    
    def timer(f): # 装饰器函数
        def inner():
            start_time = time.time() # 从1970年开始的毫秒数
            f() # 内部函数应用外部函数变量,闭包,被装饰的函数
            end_time = time.time()
            exec_time = start_time - end_time
    
        return inner()
    
    @timer
    def func():
        time.sleep(0.01)  # 为了计算运行时间差的时候有值,让程序在这儿停一会儿
        print("func")

    4,开放封闭原则:对扩展是开放的,对修改是封闭的

    5,前面的装饰器是装饰无参数无返回值的,如果想要装饰有参数有返回值的函数

    import time  #获取当前时间
    
    
    def timer(f): # 装饰器函数
        def inner(a):
            start_time = time.time()
            ret = f(a)
            end_time = time.time()
            exec_time = start_time - end_time
            return ret
    
        return inner  # 这儿记住一定不要加括号
    
    
    @timer
    def func(a):
        time.sleep(0.01)
        print("func")
        return 2
    
    
    ret = func(1)
    print(ret)

    6,想要动态传入参数,怎么办?

    import time  #获取当前时间
    
    
    def timer(f): # 装饰器函数
        def inner(*args,**kwargs):
            start_time = time.time()
            ret = f(*args,**kwargs)
            end_time = time.time()
            exec_time = start_time - end_time
            return ret
    
        return inner
    
    
    @timer
    def func(a):
        time.sleep(0.01)
        print("func")
        return 2
    
    
    ret = func(1)
    print(ret)

    7,一个标准的装饰器

    def wrapper(func): # 装饰器函数
        def inner(*args,**kwargs):
    
            # 被装饰函数之前做的事情
            ret = func(*args,**kwargs)
            # 被装饰函数之后做的事情
            return ret
    
        return inner
    
    
    @wrapper  # wahaha = wrapper(wahaha)
    def wahaha(a):
        print("func")
        return 2
    
    
    ret = wahaha(1)
    print(ret)

    8,作业题-:

    # 写函数,接收n个数字,求这些参数数字的和
    
    def sum_para(*args):
        sum = 0
        for i in args:
            sum = sum + i
        return sum
    
    print(sum_para(1,2,3,4,5))

    9,作业题二:

    # 读代码,回答:代码中,打印出来的a,b,c分别是什么,为什么?
    a = 10
    b = 20
    def test5(a,b):
        print(a,b)
    
    c = test5(b,a)
    print(c)
    
    运行结果:
    20 10
    None

    10,作业题三:

    # 读代码,回答:代码中,打印出来的a,b,c分别是什么,为什么?
    a = 10
    b = 20
    def test5(a,b):
        a = 3
        b = 5
        print(a,b)
    
    c = test5(b,a)
    print(c)
    
    运行结果:
    3 5
    None

    11,作业题四:

    # 写函数,检查获取传入列表或者元祖对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者
    def func(li):
        return li[1::2]
    
    ret = func([1,2,3,4,5,6,7,8])
    print(ret)
    
    运行结果:
    [2, 4, 6, 8]

    12,作业题五:

    # 写函数,判断用户输入的值(字符串,列表,元祖)长度是否大于5
    def func(x):
        return len(x) > 5
    
    ret = func((1,2,3,4,5,6,7))
    print(ret)
    ret = func([1,2,3])
    print(ret)
    
    运行结果:
    True
    False

    13,作业题六:

    # 写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
    def func(li):
        return li[:2] # 因为小于两个会直接全部返回,所以这个地方判断也不用添加了
    
    print(func([1,2,3,4]))
    print(func([3]))

    14,作业题七

    # 写函数,计算传入字符串中数字,字母,空格以及其他的个数,并返回结果
    
    str1 = input(">>>")
    def func(s):
    
        dict1 = {"num":0,"alpha":0,"space":0,"other":0}
        for i in s:
            if i.isdigit():  # 函数调用别忘了加括号
                dict1["num"] += 1
            elif i.isalpha():
                dict1["alpha"] += 1
            elif i.isspace():
                dict1["space"] += 1
            else:
                dict1["other"] += 1
    
        return dict1   # 返回多个值的时候,为了让外面看清楚哪个是哪个,所以用了字典类型
    
    ret = func(str1)
    print(ret)
    
    运算结果:
    {'num': 3, 'alpha': 17, 'space': 1, 'other': 0}

    15,作业题八

    def func(para):
    
        if isinstance(para,str) and para:  # 直接写入传入的参数就可以了,不需要加type
            for i in para:
                if i.isspace():
                    return True
        elif para and isinstance(para,list) or isinstance(para,tuple) :
            for i in para:
                if i == " ":
                    return True
        elif not para:
            return False
    
    
    # 老师的版本
    def func(x):
        if type(x) is str and x:  #参数是字符串,并且非空
            for i in x:
                if i == ' ':
                    return True
        elif x and type(x) is list or type(x) is tuple: #参数是列表或者元组,
            for i in x:
                if not i:
                    return True
        elif not x:   # 区分空内容和本身为空
            return True
    
    
    ret = func("str   n")
    print(ret)
    ret = func([1,2,3,4," ",5])
    print(ret)
    ret = func([1,2,3,4,"",5])
    print(ret)
    ret = func((1,2,3,4," ",5))
    print(ret)
    ret = func((1,2,3,4,"",5))
    print(ret)

    16,作业题九

    #7、写函数,检查传入字典的每一个value的长度,如果大于2,
    # 那么仅保留前两个长度的内容,并将新内容返回给调用者。
    # 自己的版本
    def func(dict1):
        for i  in dict1:
            if len(dict1[i]) > 2:
                dict1[i] = dict1[i][:2]
        return dict1
    
    dict_para = {"name":"lisa","gender":"female"}
    ret = func(dict_para)
    print(ret)
    
    # 老师的版本
        dic = {"k1": "v1v1", "k2": [11,22,33,44]}
        # PS:字典中的value只能是字符串或列表
    def func(dic):
        for k in dic:
            if len(dic[k]) > 2:
                dic[k] = dic[k][:2]
        return dic
    dic = {"k1": "v1v1", "k2": [11,22,33,44]}
    print(func(dic))

    17,作业题十

    # 8、写函数,接收两个数字参数,返回比较大的那个数字。
    # def func(num1,num2):
    #     return num1 if num1 > num2 else num2
    #
    # ret = func(3,5)
    # print(ret)

    18,作业题十一

    # 9、写函数,用户传入修改的文件名,与要修改的内容,
    # 执行函数,完成整个文件的批量修改操作(进阶)。
    # 自己的版本
    import os
    def func(filename,old,new):
        with open(filename,"r+",encoding="utf-8") as f1,
                 open("lisa.txt",mode ="w",encoding = "utf-8") as f2:
            for line in f1:
                if old in line:
                    line = line.replace(old,new)
                f2.write(line)
    
        os.rename("lisa.txt",filename)
    
    
    func("file.txt","jack","lisa")
    #
    # # 老师的版本
    def func(filename,old,new):
        with open(filename, encoding='utf-8') as f, open('%s.bak'%filename, 'w', encoding='utf-8') as f2:
            for line in f:
                if old in line:  # 班主任:星儿
                    line = line.replace(old,new)
                # 写文件
                f2.write(line)  # 小护士:金老板
    
        import os
        os.remove(filename)  # 删除文件
        os.rename('%s.bak'%filename, filename)  # 重命名文件
  • 相关阅读:
    使用EFCore连接现有数据库
    C#面试题总结
    xamarin学习--发布apk安装包
    xamarin学习--导航参数注意事项
    centos8 安装 gitlab
    mvc添加全局过滤器
    Windows平台查看端口占用情况
    asp.net core cli---创建一个不启用https的项目
    asp.net core cli
    启动nuxt项目报错WARN node unsupported "node@v8.9.3" is incompatible with chalk@^4.1.0, expec...
  • 原文地址:https://www.cnblogs.com/lisa-blog/p/10074813.html
Copyright © 2011-2022 走看看