[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:continue
if choice in menu:
while True: # 进入第二层
for k in menu[choice]:
print(k)
choice2 = input(">>:").strip()
if not choice2:continue
if choice2 in menu[choice]:
while True: # 进入第三层
for k in menu[choice][choice2]:
print(k)
choice3 = input(">>>:").strip()
if not choice3:continue
if choice3 in menu[choice][choice2]:
print("go to ",menu[choice][choice2][choice3])
elif choice3.lower() == "b":
break
elif choice3.lower() == "q":
quit()
else:
print("节点不存在")
elif choice2.lower() == "b":
break
elif 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:continue
if 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 = 0
while count < 3:
username = input("Username:").strip()
password = input("Password:").strip()
if username == _user and password == _passwd:
print("welcome ...")
break
else:
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 = True
while count < 3:
username = input("Username:").strip()
password = input("Password:").strip()
if last_username is None: # 这肯定是第一次
last_username = username
if last_username != username: # 代表这一次输入的跟上一次用户不一致
is_same_user = False # 小旗子降下来
if username in accounts:
if accounts[username][1] == 0: # 判断用户是否锁定
if password == accounts[username][0]:
print("welcome ...")
break
else:
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] = 1
f = open('user_data','w')
f.write(str(accounts))
f.close()
代码输出如下:
账号锁定后的文件状态: