作业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

原文地址:https://www.cnblogs.com/achai222/p/12559181.html