• 路飞学城系列:第2章 数据类型&文件操作-练习(3-续)【模拟登陆-优化升级】


    # coding: utf-8
    
    """
    练习题2 —— 模拟登陆-听课后升级:
    
        用户输入帐号密码进行登陆
        用户信息保存在文件内
        用户密码输入错误三次后锁定用户,下次再登录,检测到是这个用户也登录不了
    
        知识点:
        1、运用字典,对字符串str()和字典eval()互转,在文本中存储和读取账号信息。
        2、暂时不写功能的方法内,可以写pass,我看Alex喜欢这样写。
        3、缩进:选中+tab。左移:选择+shift+tab
    
        注意:
        1、文本中 只能存储str字符串(存入的字典也是字符串)。
        2、文本的 读取 和 写入,不能同时进行,建议读完就close,写完就close,及时关闭。
    
        思路:【Alex的思路,是拆分功能,一块一块的实现。由上到下(需求),一点一点啃出来。】
        1、先创建一个字典,填好数据,按照层级存放账号信息。
        2、编写代码,读取字典,实现账号登录逻辑,以及账号锁定等修改字典的逻辑。
        3、创建一个文本,把字典模拟数据,放入文本中。
        4、编写读取文本信息,转为字典(赋值给1中创建的字典),套用2中逻辑,并进行对应的写入。
    
    """
    
    """
    # 创建字典,存储模拟登录账号信息
    user_info_dict = {
        "Alex" : ["abc123", 0],   # 姓名:[密码,锁定状态(0未锁定,1锁定)]
        "李祯" : ["123456", 1],
        "牛魔王" : ["abcde12345!", 0]
    }
    # 创建文件,写入字典中的用户账号信息
    with open("模拟登录_听课后升级.txt", mode="w", encoding="utf-8") as f:
        f.write(str(user_info_dict))    # 把dict转为str后,存入到文件
    """
    
    # 读取文件,把文件中存的用户账号信息,读取出来、并且存入字典中
    with open("模拟登录_听课后升级.txt", mode="r", encoding="utf-8") as f:
        # 创建字典,存储模拟登录账号信息(把读取的str转换为dict)
        user_info_dict = eval(f.read())
    
    # 登录次数(输入账号密码),连续失败3次后锁定账号
    login_count = 0
    # 3次登录过程中,是否为相同账号
    is_same_user = True
    # 上一次登录的账号
    last_login_user = None
    # 通过while循环,实现用户登录逻辑
    while login_count < 3:
    
        # 用户输入账号
        user_input_name = input("请输入您的账号:")
        # 用户输入密码
        user_input_pwd = input("请输入您的密码:")
        # 用户登录次数加1
        login_count += 1
    
        # 更新上次登录账号状态
        if last_login_user is None:  # 肯定是第一次登录
            last_login_user = user_input_name
        # 判断登录账号是否与上次登录账号一致,账号有变更,则更新 last_login_user 和 last_login_user 状态
        if user_input_name != last_login_user:
            is_same_user = False
    
        # 账号存在
        if user_input_name in user_info_dict:
            # 账号未锁定
            if user_info_dict[user_input_name][1] == 0:
                last_login_user = user_input_name
                # 密码正确
                if user_input_pwd == user_info_dict[user_input_name][0]:
                    print("密码正确,您已登录...")
                    break
                # 密码连续错误3次(没有别的账号登录),账号锁定
                elif is_same_user is True and login_count == 3:
                    print("密码连续输错3次,账号{0}已被锁定...".format(user_input_name))
    
                    # 修改字典中存储的用户账号信息,变更锁定状态
                    user_info_dict[user_input_name][1] = 1
                    # 修改文件,把字典中用户账号信息,更新(存入)到文件中
                    with open("模拟登录_听课后升级.txt", mode="w", encoding="utf-8") as f:
                        f.write(str(user_info_dict))
    
                    break
                # 密码错误
                else:
                    print("密码错误,登录失败...")
    
            # 账号锁定
            else:
                print("账号{0}已被锁定".format(user_input_name))
    
        # 账号不存在
        else:
            print("账号不存在")
    
    # 打印看一下字典状态
    print(user_info_dict)
    

      

  • 相关阅读:
    转载:c++内存泄露机制
    推荐一款不错的dialog小工具:artDialog
    写的一些推广方法 拿出来分享下
    struts2标签具体解释
    父亲节:再见,总有一天
    Hadoop是什么
    熊猫烟花集团完美见证异速联远程接入系统
    OpenStack Networking
    管道(Pipe)/createPipe
    百度2014校园招聘算法——给出一组数据A=[a_0, a_1, a-2, ... a_n](当中n可变),打印出该数值元素的全部组合。
  • 原文地址:https://www.cnblogs.com/lizhen416/p/13662113.html
Copyright © 2020-2023  润新知