3.24作业

作业

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

import time

login_user=None

def auth(db_type='file'):
    def deco(func):
        def wrapper(*args, **kwargs):
            global login_user
            if db_type == 'file':
                if login_user:
                    res = func(*args, **kwargs)
                    return res
                else:
                    login()  #调用登录函数,登录成功login_user=登录账户
            elif db_type == 'mysql':
                print('基于mysql的认证')
                res = func(*args, **kwargs)
                return res
            elif db_type == 'ldap':
                print('基于ldap的认证')
                res = func(*args, **kwargs)
                return res
            else:
                print('不支持db_type认证')

        return wrapper

    return deco


@auth(db_type='file')
def index(x, y):
    time.sleep(2)
    print(f'inde {x} {y}')


@auth(db_type='mysql')
def home(name):
    time.sleep(2)
    print(f'这是{name}的家')


@auth(db_type='ldap')
def transfer():
    time.sleep(2)
    print('转账')


index(1, 2)
home('egon')
transfer()

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

def deco2(key):
    def deco1(func):
        def wrapper(*args, **kwargs):
            with open('a.txt', mode='rt', encoding='utf-8') as f1:
                dic = eval(f1.read().strip())
                res = func(*args, **kwargs)
                dic[key] = res
                with open('a.txt', mode='r+', encoding='utf-8') as f2:
                    str1 = str(dic)
                    f2.write(str1)
                    return res

        return wrapper

    return deco1


@deco2(key='k1')
def add(x, y):
    res = str(x + y)
    print(f'{x}+{y}={res}')
    return res


@deco2(key='k2')
def sub(x, y):
    res = str(x - y)
    print(f'{x}-{y}={res}')
    return res


@deco2(key='k3')
def muti(x, y):
    res = str(x * y)
    print(f'{x}x{y}={res}')
    return res


@deco2(key='k4')
def divi(x, y):
    res = str(x / y)
    print(f'{x}除以{y}={res}')
    return res


add(1, 1)
sub(3, 1)
muti(2, 1)
divi(4, 2)
#文件a.txt初内容:
{}
#运行函数后文件a.txt内容:
{'k1': '2', 'k2': '2', 'k3': '2', 'k4': '2.0'}

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

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

import time


def log(plan):
    def deco(func):
        def wrapper(*args, **kwargs):
            res = time.strftime('%Y-%m-%d %X')
            print(res)
            res1 = func(*args, **kwargs)
            return res1

        return wrapper

    return deco


@log(plan='学python')
def schedule(plan):
    time.sleep(2)
    print(f'此刻我绝对了我要{plan}')


schedule('玩玩玩!')
schedule('还是学点东西吧!')

4、基于迭代器的方式,用while循环迭代取值字符串、列表、元组、字典、集合、文件对象

# 字符串:
str1 = 'abcd'
res = str1.__iter__()
while True:
    try:
        print(next(res))
    except StopIteration:
        break
        
# 列表:
list1 = [1, 2, 3, 4]
res = list1.__iter__()
while True:
    try:
        print(next(res))
    except StopIteration:
        break  

# 元组:
tuple1 = (1, 2, 3, 4)
res = tuple1.__iter__()
while True:
    try:
        print(next(res))
    except StopIteration:
        break
        
# 字典:
dic1 = {'k1': 1, 'k2': 2, 'k3': 3, 'k4': 4}
res = dic1.__iter__()
while True:
    try:
        print(next(res))  # 取出的是字典的key
    except StopIteration:
        break

# 集合:
set1 = {1, 2, 3, 4}
res = set1.__iter__()
while True:
    try:
        print(next(res))
    except StopIteration:
        break

# 文件对象:
with open('a.txt', mode='rt', encoding='utf-8') as f1:
    f1.__iter__()
    res = f1.__iter__()
    while True:
        try:
            print(next(res),end='')
        except StopIteration:
            break
            
#文件a.txt内容:
1
2
3
4

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

def range1(start, stop, step=1):
    while start < stop:
        yield start
        start += step


for i in range1(1, 10, 2):
    print(i)
posted @ 2020-03-24 23:00  风起千寻  阅读(179)  评论(0编辑  收藏  举报