zoukankan      html  css  js  c++  java
  • 作业15

    作业15

    1、编写课上讲解的有参装饰器准备明天默写

    def auth(db_type):
        def deco(func):
            def wrapper(*args, **kwargs):
                name = input("请输入用户名:")
                password = input("请输入密码:")
                if db_type == "file":
                    print("基于file验证(open,for line in f)")
                    with open("db.txt", "r", encoding="utf-8") as f:
                        for line in f:
                            user, pwd = line.strip().split(":")
                            if user == name and pwd == password:
                                print("登陆成功")
                                res = func(*args, **kwargs)
                                return res
                        else:
                            print("账号名或密码错误")
                elif db_type == "mysql":
                    print("基于mysql验证")
                elif db_type == "ldap":
                    print("基于ldap验证")
                else:
                    print("不支持该类型")
    
            return wrapper
    
        return deco
    
    
    @auth("file")
    def index():
        print("欢迎到index页面")
    index()
    
    @auth("mysql")
    def index():
        print("欢迎到index页面")
    index()
    
    @auth("ldap")
    def index():
        print("欢迎到index页面")
    index()
    

    2:还记得我们用函数对象的概念,制作一个函数字典的操作吗,来来来,我们有更高大上的做法,在文件开头声明一个空字典,然后在每个函数前加上装饰器,完成自动添加到字典的操作

    # 效果:
    # func_dic = {
    #     "0": ["退出", exit],
    #     "1": ["登录", login],
    #     "2": ["注册", logon],
    #     "3": ["提现", with_draw],
    #     "4": ["查询余额", check_balance],
    #     "5": ["转账", transfer]
    # }
    
    func_dict={}
    def func_dic_gen(func):
        def wrapper(*args,**kwargs):
            for value in func_dict.values():
                if func.__name__ in value:
                     break
            else:
                count = str(len(func_dict))
                func_dict[count]=["{}".format(func.__name__), func]
            res = func(*args,**kwargs)
            return res
        return wrapper
    @func_dic_gen
    def index(x, y):
        print('index->>%s:%s' % (x, y))
    @func_dic_gen
    def home(name):
        print('home->>%s' % name)
    @func_dic_gen
    def transfer():
        print('transfer')
    
    
    index(1,2)
    home("wu")
    transfer()
    print(func_dict)
    
    

    3、 编写日志装饰器,实现功能如:一旦函数f1执行,则将消息2017-07-21 11:12:11 f1 run写入到日志文件中,日志文件路径可以指定

    注意:时间格式的获取
    import time
    time.strftime('%Y-%m-%d %X')

    import time
    
    
    def log(func):
        def wrapper(*args, **kwargs):
            res = func(*args, **kwargs)
            func_time = time.strftime('%Y-%m-%d %X')
            print(func_time)
            with open("log.txt", "a", encoding="utf-8") as f:
                f.write("{} {} run
    ".format(func_time, func.__name__))
            return res
    
        return wrapper
    
    
    @log
    def f1():
        print("f1已执行")
    
    
    f1()
    
    

    4、基于迭代器的方式,用while循环迭代取值

    字符串、列表、元组、字典、集合、文件对象

    def my_for(obj):
        obj_iter = obj.__iter__()
        while 1:
            try:
                print(obj_iter.__next__(), end=" ")
            except StopIteration:
                print("")
                break
    
    
    my_for("wqd1")
    my_for([1, 2, 4, 5])
    my_for({1, 2, 4, 5})
    my_for((1, 2, 4, 5))
    my_for({"name": 1, "age": 2, "sex": 4, "ga": 5})
    

    5、自定义迭代器实现range功能

    # print(range(1,7,2))   # range(1, 7, 2)    1,3,5
    def my_range(start,end,step=1):
        while start < end:
            yield start
            start += step
    # my = range(2,7)
    my = my_range(0,7)
    for i in my:
        print(i)
    

    1

  • 相关阅读:
    解释下Http请求头和常见响应状态码
    sys 模块常用方法
    os 模块常用方法
    说明os,sys模块有什么不同
    dict 的 items() 方法与 iteritems() 方法的不同?
    Python是如何进行类型转换的?
    Python中pass语句的作用是什么?
    创建一个简单tcp服务器需要的流程
    安全性
    传输数据的大小
  • 原文地址:https://www.cnblogs.com/achai222/p/12559181.html
Copyright © 2011-2022 走看看