# 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)