女神博客链接:https://www.cnblogs.com/Eva-J/articles/11254517.html

练习

1、整理装饰器的形成过程,背诵装饰器的固定格式
2、编写装饰器,在每次执行被装饰函数之前打印一句’每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码’
3、编写装饰器,在每次执行被装饰函数之后打印一句’每次执行完被装饰函数之后都得先经过这里,这里根据需求添加代码’
4、编写装饰器,在每次执行被装饰函数之前让用户输入用户名,密码,给用户三次机会,登录成功之后,才能访问该函数.
5、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,只支持单用户的账号密码,给用户三次机会),要求登录成功一次,后续的函数都无需再输入用户名和密码
6、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,可支持多账号密码),要求登录成功一次(给三次机会),后续的函数都无需再输入用户名和密码。
7、给每个函数写一个记录日志的功能,

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

8、lambda是什么?试着把简单的需求写成lambda函数。

# -*- coding:utf-8 -*-
# caiqinxiong 
# 2019/7/28 上午10:43

# # 监听
# def listen():
# with open(r'operate.log',mode='r',encoding='utf-8') as f:
#         while True:
#             conten = f.readline().strip()
#             if 'error' in conten:
#                 yield conten
#
# for conten in listen():
#     print(conten)
#
# # 操作监听的文件
# def wite_file():
#     f = open(r'operate.log',mode='a',encoding='utf-8')
#     inp = input()
#     f.write(inp)
#     f.close()
#
# wite_file()

# # 利用生成器来提高读取效率
# def get_user():
#     with open(r'userinfo', mode='r',encoding='utf-8') as f:
#         for line in f:
#             user,pwd = line.strip().split('|')
#             yield user,pwd

# lst = [i for i in range(1,31) if i % 3 == 0]
# print(lst)
#
# lst = [i**2 for i in range(1,31) if i % 3 == 0]
# # print(lst)
#
# def add(n,i):
#     return n+i
#
# def test():
#     for i in range(4):
#         yield i
#
# g=test()
# for n in [1,10]:
#     g=(add(n,i) for i in g)
# #
# print(list(g))

# def demo():
#     for i in range(4):
#         yield i

# g = demo()
#
# g1=(i for i in g)
# print(list(g1))
# print(list(g))
# # g2=(i for i in g1)
#
# # print(list(g1))
# # print(list(g2))

#
# fun1 = lambda a,b: a if a> b else b
# ret = fun1(1,3)
# print(ret)
#
#
# func2 = lambda a:'偶数' if a % 2 == 0 else '奇数'
#
# print(func2(2))


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

# 装饰器的固定格式

# def 装饰器的名字(func):
#     def inner(*args,**kwargs):
#         '''在执行被装饰的函数之前要做的事儿'''
#         '''判断是否登录'''
#         ret = func(*args,**kwargs)
#         '''在执行被装饰的函数之后要做的事儿'''
#         '''写log'''
#         return ret
#     return inner
#
# @装饰器的名字
# def wahaha():
#     pass
#
# wahaha()

'''
2、编写装饰器,在每次执行被装饰函数之前打印一句’每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码’
'''

# def warrper(func):
#     def inner(*args,**kwargs):
#         print('每次执行被装饰函数之前都得先经过这里,这里根据需求添加代码')
#         ret = func(*args,**kwargs)
#         return ret
#     return inner
#
# @warrper
# def func():
#     print('in the func')
# func()

'''
3、编写装饰器,在每次执行被装饰函数之后打印一句’每次执行完被装饰函数之后都得先经过这里,这里根据需求添加代码’
'''
# def warrper(func):
#     def inner(*args,**kwargs):
#         ret = func(*args,**kwargs)
#         print('每次执行完被装饰函数之后都得先经过这里,这里根据需求添加代码')
#         return ret
#     return inner
#
# @warrper
# def func():
#     print('in the func')
# func()
'''
4、编写装饰器,在每次执行被装饰函数之前让用户输入用户名,密码,给用户三次机会,登录成功之后,才能访问该函数.
'''
# # 用户信息
# user_info = {'caiqinxiong': 'cai', 'lixiaoxin': '123'}
# def loggin(user_info):
#     '''登录'''
#     def warrper(func):
#         def inner(*args,**kwargs):
#             i = 3
#             while i > 0:
#                 i -= 1
#                 username = input('请输入用户名:')
#                 if username in user_info:
#                     j = 3
#                     while j > 0:
#                         j -= 1
#                         password = input('请输入密码:')
#                         if password == user_info[username]:
#                             ret = func(*args,**kwargs)
#                             return ret
#                         else:
#                             print('密码输入有误!')
#                             if j == 0:
#                                 print('您的尝试机会已用完,账号已锁定,请10分钟后重新尝试!')
#                                 exit(-1)
#                             else:
#                                 print('你还有%s次尝试机会!' % j)
#
#
#                 else:
#                     print('用户名不存在!')
#                     if i != 0:
#                         print('你还有%s次尝试机会!' % i)
#                     else:
#                         print('您的尝试机会已用完!')
#                         exit(-1)
#         return inner
#     return warrper
#
# @loggin(user_info)
# def func():
#     print('wlcome to oldBoy!')
#
# func()

'''
5、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,只支持单用户的账号密码,给用户三次机会),要求登录成功一次,后续的函数都无需再输入用户名和密码
'''
# FLAG = False
# def get_user(file):
#     with open(file,mode = 'r',encoding='utf-8') as f:
#         for line in f:
#             usr,pwd = line.strip().split('|')
#             yield usr,pwd
#
# def login(func):
#     def inner(*args,**kwargs):
#         global FLAG  # 将FLAG变量设置成全局变量
#         if FLAG:
#             ret = func(*args, **kwargs)
#             return ret
#         else:
#             for i in range(3):
#                 user = input('username :')
#                 passwd = input('password :')
#                 for usr,pwd in get_user('userinfo'):
#                     if usr == user and pwd == passwd:
#                         print('登录成功')
#                         FLAG = True
#                         ret = func(*args,**kwargs)
#                         return ret
#                 else:
#                     print('账号或密码错误!')
#             else:
#                 print('登录失败')
#     return inner
#
# @login
# def func1():
#     print('in the func1')
#
# @login
# def func2():
#     print('in the func2')
# func1()
# func2()

'''
6、编写装饰器,为多个函数加上认证的功能(用户的账号密码来源于文件,可支持多账号密码),要求登录成功一次(给三次机会),后续的函数都无需再输入用户名和密码。
'''
'''
7、给每个函数写一个记录日志的功能,
功能要求:每一次调用函数之前,要将函数名称,时间节点记录到log的日志中。
所需模块:
import time
struct_time = time.localtime()
print(time.strftime("%Y-%m-%d %H:%M:%S",struct_time))
'''
# from functools import wraps
# import time
# def log(func):
#     @wraps(func)
#     def inner(*args, **kwargs):
#         ret = func(*args, **kwargs)
#         DATE = time.strftime('%Y-%m-%d %H:%M:%S')
#         with open(r'access.log', mode='a', encoding='utf-8') as f:
#             log_conten = '用户[%s]在%s执行了%s函数\n' % (args[0], DATE, func.__name__)
#             # print(log_conten)
#             f.write(log_conten)
#         return ret
#
#     return inner
#
# @log
# def func1():
#     print('in the func1')
#
# @log
# def func2():
#     print('in the func2')
#
# func1()
# func2()


'''
8、lambda是什么?试着把简单的需求写成lambda函数。
'''
# lambda 是匿名函数
# lambda表达式 a,b两个值,求比较大的值
# lambda表达式 a为参数,求a的奇\偶性
# lambda表达式 a为参数,求a的绝对值

# func1 = lambda a,b : a if a>b else b
# ret = func1(10,2)
# print(ret)
#
# func2 = lambda a : '偶数' if a%2 == 0 else '奇数'
# ret = func2(5)
# print(ret)
#
# func3 = lambda a:a if a>0 else -a
# ret = func3(-5)
# print(ret)
# ret = func3(10)
# print(ret)
#
# func = lambda :2+3+4+5
# ret = func()
# print(ret)

def func():
    def func1():
        print('in the func1')
    return func1
f = func()
f()

def wahaha():
    pass

def login(func):
    def inner(*args,**kwargs):
        print('start')
        ret = func(*args,**kwargs)
        print('end')
        return ret
    return inner
f = login(wahaha)
f()
练习题

 

作业

模拟博客园登录:
1),启动程序,首页面应该显示成如下格式:

复制代码
欢迎来到博客园首页
1:请登录
2:请注册
3:文章页面
4:日记页面
5:评论页面
6:收藏页面
7:注销
8:退出程序
复制代码

2),用户输入选项,3~6选项必须在用户登录成功之后,才能访问成功。
3),用户选择登录,用户名密码从register文件中读取验证,三次机会,没成功则结束整个程序运行,成功之后,可以选择访问3~6项,访问页面之前,必须要在log文件中打印日志,日志格式为-->用户:xx 在xx年xx月xx日 执行了 %s函数,访问页面时,页面内容为:欢迎xx用户访问评论(文章,日记,收藏)页面
4),如果用户没有注册,则可以选择注册,注册成功之后,可以自动完成登录,然后进入首页选择。
5),注销用户是指注销用户的登录状态,使其在访问任何页面时,必须重新登录。
6),退出程序为结束整个程序运行。

# -*- coding:utf-8 -*-
# caiqinxiong 
# 2019/7/28 下午8:34
from functools import wraps
import time
import json
import os
import sys

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
sys.path.append(BASE_DIR)


def getUser():
    '''获取账户信息'''
    try:
        with open(r'register.txt', mode="r", encoding="utf-8") as f:
            users = json.load(f)
            # print(users)
    except:
        print('have no users inof!')
        users = {}
    return users


def setUser(users):
    '''写入用户信息'''
    with open(r'register.txt', mode='w') as f:
        json.dump(users, f, indent="\t")
        # print(users)


def checkUser(users, username):
    '''检查用户是否存在'''
    if username in users:
        return True
    return False


def checkPassword(users, username, password):
    '''校验密码是否正确'''
    if password == users[username]:
        return True
    else:
        return False


def login(users, login_status):
    '''登录'''
    if login_status:
        return login_status
    i = 3
    while i > 0:
        i -= 1
        username = input('请输入用户名:')
        if checkUser(users, username):
            j = 3
            while j > 0:
                j -= 1
                password = input('请输入密码:')
                if checkPassword(users, username, password):
                    print('登录成功!')
                    printPage(username)
                else:
                    print('密码输入有误!')
                    if j == 0:
                        print('登录失败,谢谢使用!')
                        exit(-1)
                    else:
                        print('你还有%s次尝试机会!' % j)
        else:
            print('用户名不存在!')
            if i != 0:
                print('你还有%s次尝试机会!' % i)
            else:
                print('您的尝试机会已用完,是否注册新用户?Y/N')
                while True:
                    choise = input().strip().upper()
                    if 'Y' == choise:
                        register(users)
                        break
                    elif 'N' == choise:
                        print('谢谢使用!')
                        exit(-1)
                    else:
                        print('输入有误!')


def register(users):
    '''注册 '''
    i = 3
    while i > 0:
        i -= 1
        username = input('请输入注册的用户名:')
        if checkUser(users, username):
            print('用户名已存在!')
            if i != 0:
                print('请重新输入,你还有%s次尝试机会!' % i)
            else:
                print('您的尝试次数已用完!')
        else:
            j = 3
            while j > 0:
                j -= 1
                password1 = input('请输入密码:')
                password2 = input('请再次输入密码:')
                if password1 == password2:
                    print('账户\033[42;1m%s\033[0m注册成功!' % username)
                    users[username] = password1
                    setUser(users)
                    users = getUser()
                    return menu(users, username, login_status=True)
                else:
                    print('两次输入密码不一致!')
                    if j == 0:
                        print('操作过于频繁,请5分钟后再次尝试!')
                        time.sleep(300)
                    else:
                        print('你还有%s次尝试机会!' % j)


def log(func):
    @wraps(func)
    def inner(*args, **kwargs):
        ret = func(*args, **kwargs)
        # DATE = time.strftime('%Y-%m-%d %H:%M:%S')
        cc = time.localtime(time.time())
        DATE = str(cc.tm_year) + '' + str(cc.tm_mon) + '' + str(cc.tm_mday) + ''
        with open(r'access.log', mode='a', encoding='utf-8') as f:
            log_conten = '用户[%s]在%s执行了%s函数\n' % (args[0], DATE, func.__name__)
            # print(log_conten)
            f.write(log_conten)
        return ret

    return inner


@log
def articlePage(username, login_status):
    '''文章页面'''
    print('欢迎%s用户访问\033[31;1m文章\033[0m页面!' % username)
    return


@log
def diaryPage(username, login_status):
    '''日记页面'''
    print('欢迎%s用户访问\033[31;1m日记\033[0m页面!' % username)
    return


@log
def commentPage(username, login_status):
    '''评论页面'''
    print('欢迎%s用户访问\033[31;1m评论\033[0m页面!' % username)
    return


@log
def collectionPage(username, login_status):
    '''收藏页面'''
    print('欢迎%s用户访问\033[31;1m收藏\033[0m页面!' % username)
    return


def turnBack(username, login_status):
    '''返回上级菜单'''
    print(''.center(15, '*'))
    print("1、返回上级")
    print("2、退出")
    print(''.center(15, '*'))
    while True:
        choise = input("请选择:")
        if choise == '1':
            menu(users, username, login_status)
            break
        elif choise == '2':
            print("谢谢使用!")
            exit(-1)
        else:
            print("输入有误,请重新输入!")


def printPage(username):
    '''打印访问页面'''
    print('#' * 20)
    print('3、文章页面')
    print('4、日记页面')
    print('5、评论页面')
    print('6、收藏页面')
    print('#' * 20)
    while True:
        choise = input('请选择:').strip()
        if '3' == choise or '4' == choise or '5' == choise or '6' == choise:
            return accessPage(username, choise, login_status=True)
        else:
            print('输入有误!')


def accessPage(username, choise, login_status):
    '''访问页面逻辑控制'''
    if '3' == choise:
        articlePage(username, login_status)
    elif '4' == choise:
        diaryPage(username, login_status)
    elif '5' == choise:
        commentPage(username, login_status)
    elif '6' == choise:
        collectionPage(username, login_status)
    else:
        print('输入有误!,请重新输入!')

    return turnBack(username, login_status)


def menu(users, username='', login_status=False):
    '''主菜单'''
    print('#' * 20)
    print('''欢迎来到博客园首页
1、登录博客园
2、注册新用户
3、文章页面
4、日记页面
5、评论页面
6、收藏页面
7、注销
8、退出程序''')
    print('#' * 20)
    while True:
        choise = input('请选择:').strip()
        if '1' == choise:
            if login_status:
                print('用户已登录,请重新选择!')
            else:
                login(users, login_status)
        elif '2' == choise:
            register(users)
        elif '3' == choise or '4' == choise or '5' == choise or '6' == choise:
            if login_status:
                accessPage(username, choise, login_status)
            else:
                print('请登录后访问!')
                login(users, login_status)
        elif '7' == choise:
            print(''.center(15, '*'))
            print('注销成功,已退出登录!')
            login_status = False
            turnBack(username, login_status)
        elif '8' == choise:
            print('谢谢使用!')
            exit(-1)
        else:
            print('输入有误,请重新输入!')


if __name__ == '__main__':
    users = getUser()
    menu(users)
版本1
# -*- coding:utf-8 -*-
# caiqinxiong 
# 2019/7/29 下午11:01
from functools import wraps
import time
import os
import sys

BASE_DIR = os.path.dirname(os.path.dirname(__file__))
sys.path.append(BASE_DIR)
dict_info = {'login_status': False, 'username': None}


def get_user(file):
    '''获取用户信息'''
    with open(file, mode='r', encoding='utf-8') as f:
        for line in f:
            usr, pwd = line.strip().split('|')
            yield usr, pwd


def login(func):
    '''登录验证'''
    @wraps(func)
    def inner(*args, **kwargs):
        if dict_info['login_status'] == True:
            print('已是登录状态!')
            ret = func(*args, **kwargs)
            return ret
        else:
            for i in range(3):
                user = input('请输入登录名 :')
                passwd = input('请输入密码 :')
                for usr, pwd in get_user('userinfo'):
                    if usr == user and pwd == passwd:
                        print('#' * 20)
                        print('登录成功')
                        dict_info['login_status'] = True
                        dict_info['username'] = user
                        ret = func(*args, **kwargs)
                        return ret
                else:
                    print('账号或密码错误!')
            else:
                print('您的3次尝试机会已用完,谢谢使用!')
                exit(-1)

    return inner


def log(func):
    '''日志'''
    @wraps(func)
    def inner(*args, **kwargs):
        ret = func(*args, **kwargs)
        DATE = time.strftime('%Y-%m-%d %H:%M:%S')
        with open(r'access.log', mode='a', encoding='utf-8') as f:
            log_conten = '用户[%s]在%s执行了%s函数\n' % (args[0], DATE, func.__name__)
            # print(log_conten)
            f.write(log_conten)
        return ret

    return inner


@login
def loginBlog():
    '''登录博客'''
    return printMenu()


def register():
    '''注册'''
    for i in range(3):
        user = input('请输入注册名 :')
        for usr, pwd in get_user('userinfo'):
            if usr == user:
                print('用户名已存在!')
                break
        else:
            passwd = input('请输入密码 :')
            print('账户\033[42;1m%s\033[0m注册成功!' % user)
            dict_info['login_status'] = True
            dict_info['username'] = user
            with open('userinfo', mode='a', encoding='utf-8') as f:
                f.write(user + '|' + passwd + '\n')
            printMenu()
            break
    else:
        print('操作过于频繁,请5分钟后再试!')
        time.sleep(300)


@login
@log
def articlePage(username):
    '''文章页面'''
    print('欢迎%s用户访问\033[31;1m文章\033[0m页面!' % username)
    return printMenu()


@login
@log
def diaryPage(username):
    '''日记页面'''
    print('欢迎%s用户访问\033[31;1m日记\033[0m页面!' % username)
    return printMenu()


@login
@log
def commentPage(username):
    '''评论页面'''
    print('欢迎%s用户访问\033[31;1m评论\033[0m页面!' % username)
    return printMenu()


@login
@log
def collectionPage(username):
    '''收藏页面'''
    print('欢迎%s用户访问\033[31;1m收藏\033[0m页面!' % username)
    return printMenu()


def printMenu():
    '''打印主菜单'''
    print('#' * 20)
    print('''欢迎来到博客园首页
1、登录博客园
2、注册新用户
3、文章页面
4、日记页面
5、评论页面
6、收藏页面
7、注销
8、退出程序''')
    print('#' * 20)


def main():
    '''主控制逻辑'''
    while True:
        choise = input('请选择:').strip()
        if '1' == choise:
            loginBlog()
        elif '2' == choise:
            register()
        elif '3' == choise:
            articlePage(dict_info['username'])
        elif '4' == choise:
            diaryPage(dict_info['username'])
        elif '5' == choise:
            commentPage(dict_info['username'])
        elif '6' == choise:
            collectionPage(dict_info['username'])
        elif '7' == choise:
            print('#' * 20)
            print('注销成功,已退出登录!')
            dict_info['login_status'] = False
            printMenu()
        elif '8' == choise:
            print('谢谢使用!')
            exit(-1)
        else:
            print('输入有误,请重新输入!')


if __name__ == '__main__':
    printMenu()
    main()
版本2

 

posted on 2019-07-30 11:44  雨之夜&秋  阅读(156)  评论(0编辑  收藏  举报