函数进阶-练习题

# 1、整理装饰器的形成过程,背诵装饰器的固定格式

def wrapper(f):
    def inner(*args, **kwargs):
        ret = f(*args, **kwargs)
        return ret
    return inner


# 2、 编写装饰器,在每次执行被装饰函数之前打印一句’每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码’
def wrapper(f):
    def inner(*args, **kwargs):
        print('每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码')
        ret = f(*args, **kwargs)
        return ret
    return inner

# 3、编写装饰器,在每次执行被装饰函数之后打印一句’每次执行完被装饰函数之后都得先经过这里,这里根据需求添加代码’
def wrapper(f):
    def inner(*args, **kwargs):
        ret = f(*args, **kwargs)
        print('每次执行被装饰函数之后都得先经过这里,这里根据需求添加代码')
        return ret
    return inner

# 4、编写装饰器,在每次执行被装饰函数之前让用户输入用户名,密码,给用户三次机会,登录成功之后,才能访问该函数.

#  定义登录状态
login_status = {
    'username': None,
    'password':None,
    'status': False,
}

# 定义装饰器
def login(f):
    def inner(*args, **kwargs):
        if login_status['status']:
            ret = f(*args, **kwargs)
            return ret
        else:
            count = 0
            while count < 3:
                name = input('请输入用户名:').strip()
                password = input('请输入密码:').strip()
                if name == 'mayugang' and password == '123456':
                    print('恭喜你,登录成功!')
                    login_status['username'] = name
                    login_status['password'] = password
                    login_status['status'] = True
                    ret = f(*args, **kwargs)
                    return ret
                elif name != 'mayugang' or password != '123456':
                    print('输入的账号或者密码有误,请重新输入!')
                    count = count + 1
                    n = str(3 - count)
                    print('您有' + n + '次重试机会')
                    if n == '0':
                        print('抱歉,您已经没有登录机会!')

    return inner
@login  # func = login(func)
def func():
    print('欢迎访问系统页面')


func()

# 5、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,只支持单用户的账号密码,给用户三次机会),要求登录成功一次,后续的函数都无需再输入用户名和密码
 # 定义登录状态
login_status = {
    'username': None,
    'password':None,
    'status': False,
}

# 定义装饰器
def login(f):
    def inner(*args, **kwargs):
        if login_status['status']:
            ret = f(*args, **kwargs)
            return ret
        else:
            count = 0
            while count < 3:
                name = input('请输入用户名:').strip()
                password = input('请输入密码:').strip()

                # 通过读文件的方式获取用户名和密码。
                f1 = open('账号管理', encoding='utf-8', mode='r')
                content = f1.read().strip().split('|')
                if name == content[0].strip() and password == content[1].strip():
                    print('恭喜你,登录成功!')
                    login_status['username'] = content[0].strip()
                    login_status['password'] = content[1].strip()
                    login_status['status'] = True
                    ret = f(*args, **kwargs)
                    return ret
                elif name != content[0].strip() or password != content[1].strip():
                    print('输入的账号或者密码有误,请重新输入!')
                    count = count + 1
                    n = str(3 - count)
                    print('您有' + n + '次重试机会')
                    if n == '0':
                        print('抱歉,您已经没有登录机会!')
                        quit()
                f1.close()

    return inner
@login  # func = login(func)
def func():
    print('欢迎访问系统页面')


func()

@login
def func1():
    print('欢迎访问系统页面1')


func1()

@login
def func2():
    print('欢迎访问系统页面2')


func2()

# 6,编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,可支持多账号密码),要求登录成功一次(给三次机会),后续的函数都无需再输入用户名和密码。
login_status = {
    'username': None,
    'password':None,
    'status': False,
}

# 定义装饰器
def login(f):
    def inner(*args, **kwargs):
        if login_status['status']:
            ret = f(*args, **kwargs)
            return ret
        else:
            count = 0
            while count < 3:
                name = input('请输入用户名:').strip()
                password = input('请输入密码:').strip()

                # 通过读文件的方式获取用户名和密码,支持多个账号和密码。
                f1 = open('多账号管理', encoding='utf-8', mode='r')
                for i in f1:
                    content = i.strip().split('|')
                    if name == content[0].strip() and password == content[1].strip():
                        print('恭喜你,登录成功!')
                        login_status['username'] = content[0].strip()
                        login_status['password'] = content[1].strip()
                        login_status['status'] = True
                        ret = f(*args, **kwargs)
                        return ret
                    elif name != content[0].strip() or password != content[1].strip():
                        print('输入的账号或者密码有误,请重新输入!')
                        count = count + 1
                        n = str(3 - count)
                        print('您有' + n + '次重试机会')
                        break

                if count >= 3:
                    print('抱歉,您已经没有登录机会!')
                    quit()
                f1.close()

    return inner
@login  # func = login(func)
def func():
    print('欢迎访问系统页面0')


func()

@login
def func1():
    print('欢迎访问系统页面1')


func1()

@login
def func2():
    print('欢迎访问系统页面2')


func2()

'''
7,给每个函数写一个记录日志的功能,

        功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。
        所需模块:
        import time
        struct_time = time.localtime()
        print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))
'''
## 导入时间模块
import time

struct_time = time.localtime()
print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))

# 定义一个记录日志的装饰器
def log(f):
    def inner(*args, **kwargs):
        t = f.__name__  # 注意,是两个下划线组成了一个下划线
        f1 = open('日志文件log',encoding='utf-8',mode='a')
        f1.write(time.strftime("%Y-%m-%d %H:%M:%S", struct_time))
        f1.write(' '+t +'\n')
        f(*args, **kwargs)
        f1.close()
    return inner


@log
def func1():
    pass

func1()

@log
def func2():
    pass

func2()

@log
def func3():
    pass

func3()

 

posted @ 2018-11-06 12:39  马玉刚  阅读(311)  评论(0)    收藏  举报