[Python学习日记-29] 开发基础练习2——三级菜单与用户登录
简介
三级菜单
用户登录
简介
该练习使用了列表、字典、字符串等之前学到的数据类型,用于巩固实践之前学习的内容。
三级菜单
一、题目
数据结构:
menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'网易': {},
'google': {},
},
'中关村': {
'爱奇艺': {},
'汽车之家': {},
'youku': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'新东方': {},
'北航': {},
},
'天通苑': {},
'回龙观': {},
},
'朝阳': {},
'东城': {},
},
'上海': {
'闵行': {
'人民广场': {
'炸鸡店': {}
},
},
'闸北': {
'火车站': {
'携程': {},
},
},
'浦东': {},
},
'山东': {},
}
需求:
- 可依次选择进入各子菜单
- 可从任意一层往回退到上一层
- 可从任意一层退出程序
所需知识点:列表、字典
二、答案——普通版
v1.0.1:
menu = {'北京':{'海淀':{'五道口':{'soho':{},'网易':{},'google':{}},'中关村':{'爱奇艺':{},'汽车之家':{},'youku':{},},'上地':{'百度':{},},},'昌平':{'沙河':{'新东方':{},'北航':{},},'天通苑':{},'回龙观':{},},'朝阳':{},'东城':{},},'上海':{'闵行':{'人民广场':{'炸鸡店':{}}},'闸北':{'火车站':{'携程':{}}},'浦东':{},},'山东':{},
}while True:for k in menu:print(k)choice = input(">:").strip()if not choice:continueif choice in menu:while True: # 进入第二层for k in menu[choice]:print(k)choice2 = input(">>:").strip()if not choice2:continueif choice2 in menu[choice]:while True: # 进入第三层for k in menu[choice][choice2]:print(k)choice3 = input(">>>:").strip()if not choice3:continueif choice3 in menu[choice][choice2]:print("go to ",menu[choice][choice2][choice3])elif choice3.lower() == "b":breakelif choice3.lower() == "q":quit()else:print("节点不存在")elif choice2.lower() == "b":breakelif choice2.lower() == "q":quit()else:print("节点不存在")elif choice.lower() == "b":print("无路可退")elif choice.lower() == "q":quit()else:print("节点不存在")
代码输出如下:
v1.0.2:
menu = {'北京':{'海淀':{'五道口':{'soho':{},'网易':{},'google':{}},'中关村':{'爱奇艺':{},'汽车之家':{},'youku':{},},'上地':{'百度':{},},},'昌平':{'沙河':{'新东方':{},'北航':{},},'天通苑':{},'回龙观':{},},'朝阳':{},'东城':{},},'上海':{'闵行':{'人民广场':{'炸鸡店':{}}},'闸北':{'火车站':{'携程':{}}},'浦东':{},},'山东':{},
}# 保存进入的每一层记录
current_layer = menu
layers = []
while True:for k in current_layer:# menu[北京]print(k)choice = input(">>:").strip()if not choice:continueif choice in current_layer:# menu[北京]layers.append(current_layer)# 进入下一层,保存当前层current_layer = current_layer[choice]# menu[北京][昌平]elif choice == 'b':if len(layers) != 0:current_layer = layers.pop()else:print("已经是顶层!")
代码输出如下:
三、答案——进阶版
# -*- coding:utf-8 -*-
layers = [{'北京': {'海淀': {'五道口': {'soho': {}, '网易': {}, 'google': {}}, '中关村': {'爱奇艺': {}, '汽车之家': {}, 'youku': {}, }, '上地': {'百度': {}, }, }, '昌平': {'沙河': {'新东方': {}, '北航': {}, }, '天通苑': {}, '回龙观': {}, }, '朝阳': {}, '东城': {}, }, '上海': {'闵行': {'人民广场': {'炸鸡店': {}}}, '闸北': {'火车站': {'携程': {}}}, '浦东': {}, }, '山东': {}, }]
while True:[print(k) for k in layers[-1]] # menu[北京]choice = input(">>:").strip()if choice in layers[-1]:layers.append(layers[-1][choice]) # 进入下一层,保存当前层elif choice.lower() == 'b' and len(layers) > 1:del layers[-1]elif choice.lower() == 'q':quit("有缘再见")else:print("输入异常")
代码输出如下:
用户登录
一、题目
基础需求:
- 让用户输入用户名密码
- 认证成功后显示欢迎信息
- 输错三次后退出程序
升级需求:
- 可以支持多个用户登录(提示:通过列表存多个账户信息)
- 用户3次认证失败后,退出程序,再次启动程序尝试登录时,还是锁定状态(提示:需把用户锁定的状态存到文件里)
二、答案
1、基础需求版本
# -*- coding:utf-8 -*-_user = "alex"
_passwd = "abc123"count = 0while count < 3:username = input("Username:").strip()password = input("Password:").strip()if username == _user and password == _passwd:print("welcome ...")breakelse:print("Wrong username or password.")count += 1
else:print("Too many attempts.")# 连续输错三次,并不是输错三次
accounts = {'alex': ['abc123', 0],'jack': ['1413', 1],'rain': ['ddsss', 0]
}
代码输出如下:
2、升级需求版本
user_data:(用于存储用户信息)
{'jove': ['abc123', 0], 'jack': ['1413', 0], 'rain': ['ddsss', 0]} # 用户名:[密码,锁定状态]
# -*- coding:utf-8 -*-f = open('user_data','r')
accounts = eval(f.read())count = 0
last_username = None
is_same_user = Truewhile count < 3:username = input("Username:").strip()password = input("Password:").strip()if last_username is None: # 这肯定是第一次last_username = usernameif last_username != username: # 代表这一次输入的跟上一次用户不一致is_same_user = False # 小旗子降下来if username in accounts:if accounts[username][1] == 0: # 判断用户是否锁定if password == accounts[username][0]:print("welcome ...")breakelse:print("Wrong username or password.")else:print("Account was lock,pleace call Administrator.")else:print("Account not live.")count += 1
else:print("Too many attempts.")if is_same_user == True: # 3次输入的一致,锁定用户accounts[username][1] = 1f = open('user_data','w')f.write(str(accounts))f.close()
代码输出如下:
账号锁定后的文件状态: