这是刚开始写程序,三级菜单的程序基本是用字典实现,很low,以后学习了其他更好的东西,我会继续上传,然后争取在我水平高深之后,把这个简单的东西实现的狠高大上。

一,三级菜单

要求:

  • 可依次选择进入各子菜单
  • 可从任意一层往回退到上一层
  • 可从任意一层退出程序
  • 所需新知识点:列表、字典'''

数据结构如下:

menu = {
'北京':{
'海淀':{
'五道口':{
'soho':{},
'网易':{},
'google':{}
},
'中关村':{
'爱奇艺':{},
'汽车之家':{},
'youku':{},
},
'上地':{
'百度':{},
},
},
'昌平':{
'沙河':{
'老男孩':{},
'北航':{},
},
'天通苑':{},
'回龙观':{},
},
'朝阳':{},
'东城':{},
},
'上海':{
'闵行':{
"人民广场":{
'炸鸡店':{}
}
},
'闸北':{
'火车战':{
'携程':{}
}
},
'浦东':{},
},
'山东':{},
}

  

1,一个简单的三级菜单的实现

  代码如下:

menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'网易': {},
'google': {}
},
'中关村': {
'爱奇艺': {},
'汽车之家': {},
'youku': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龙观': {},
},
'朝阳': {},
'东城': {},
},
'上海': {
'闵行': {
"人民广场": {
'炸鸡店': {}
}
},
'闸北': {
'火车战': {
'携程': {}
}
},
'浦东': {},
},
'山东': {},
} while True:
for k in menu:
print(k)
choice1 = input("请输入地址(按b返回上一层,按q退出程序)\n").strip()
if not choice1:
continue
if choice1 in menu:
while True: # 进入第二层
for k in menu[choice1]:
print(k)
choice2 = input("请输入地址(按b返回上一层,按q退出程序)\n").strip()
if not choice2:
continue
if choice2 in menu[choice1]:
while True: # 进入第三层
for k in menu[choice1][choice2]:
print(k)
choice3 = input("请输入地址(按b返回上一层,按q退出程序)\n").strip()
if not choice3:
continue
if choice3 in menu[choice1][choice2]:
print("go to ", menu[choice1][choice2][choice3])
elif choice3 == 'q':
exit("再见,欢迎再次使用")
elif choice3 == 'b':
break
else:
print("节点不存在")
elif choice2 == 'b':
break
elif choice2 == 'q':
exit("再见 ,欢迎再次使用")
else:
print("节点不存在") elif choice1 == 'q':
print("再见 ,欢迎再次使用")
break
elif choice1 == 'b':
print("已经是最高层了,没有上一层")
break

  此方法当然可以实现,就是代码比较冗余。

2,一个高级的三级菜单的实现

  只用一个while循环,且整体代码量少于15行

menu = {
'北京':{
'海淀':{
'五道口':{
'soho':{},
'网易':{},
'google':{}
},
'中关村':{
'爱奇艺':{},
'汽车之家':{},
'youku':{},
},
'上地':{
'百度':{},
},
},
'昌平':{
'沙河':{
'老男孩':{},
'北航':{},
},
'天通苑':{},
'回龙观':{},
},
'朝阳':{},
'东城':{},
},
'上海':{
'闵行':{
"人民广场":{
'炸鸡店':{}
}
},
'闸北':{
'火车战':{
'携程':{}
}
},
'浦东':{},
},
'山东':{},
}
current_layer = menu
parent_list = []
while True:
for key in current_layer:
print(key)
choice = input("请输入地址,或者按b返回上一层,按q退出程序>>>:").strip()
if len(choice) ==0:continue
if choice in current_layer:
parent_list.append(current_layer) #进入下一层之前保存当前层
current_layer =current_layer[choice] #将子层赋值给动态字典
elif choice == 'b':
if len(parent_list) !=0:
current_layer =parent_list.pop() #取出列表的最后一个值,并返回这个值
else:print("已经是最后一层")
elif choice =='q':break
else:
print("您所输入的地址不存在,请重输")

  此处实现的方式稍微高级一些,代码量也简洁了不少,而且方法更加巧妙,初学者要理解这里,则需要下很大的功夫。

3,对于多级字典和列表的修改

  当我们将多级列表的内容写入一个空字典,然后在字典中修改内容,我们会发现列表的内容也相应的修改。

  因为我们使用的是同一个内存地址。

  如果说我们想只修改字典中的内容,而让列表中的内容不变,则我们需要copy列表。

  如下:

menu_list = [
{'id': 1, 'title': '菜单1'},
{'id': 2, 'title': '菜单2'},
{'id': 3, 'title': '菜单3'},
] menu_dict = {} for item in menu_list:
menu_dict[item['id']] = item
# print(item) # {'id': 1, 'title': '菜单1'}
# print(item['id']) # 1
print(menu_dict) # 当我们这样将 menu_list 写入 menu_dict中
# 下面我们修改 mebu_dict中的值,menu_list中的值会发生改变??? print(menu_list)
menu_dict[2]['title'] = '修改后的菜单2'
print(menu_list)
'''
[{'id': 1, 'title': '菜单1'}, {'id': 2, 'title': '菜单2'}, {'id': 3, 'title': '菜单3'}]
[{'id': 1, 'title': '菜单1'}, {'id': 2, 'title': '修改后的菜单2'}, {'id': 3, 'title': '菜单3'}] '''

  字典的查找

# 字典的查找
menu_list = [
{'id': 1, 'title': '菜单1'},
{'id': 2, 'title': '菜单2'},
{'id': 3, 'title': '菜单3'},
] # 请判断:id=2 的值在列表中是否存在?
for item in menu_list:
if item['id'] == 2:
print("id=2 的值在列表中存在") # menu_dict = {}
# for item in menu_list:
# menu_dict[item['id']] = item
# print(menu_dict) menu_dict = {
1: {'id': 1, 'title': '菜单1'},
2: {'id': 2, 'title': '菜单2'},
3: {'id': 3, 'title': '菜单3'}
}
# 请判断:id=2 的值在字典中是否存在? if 2 in menu_dict:
print("id=2 的值在字典中存在")

  但是当我们做如下实验,将一个变量追加到list中,然后修改列表中的变量,我们发现变量是不变的

user = 'james'

lis = []
lis.append(user)
print(lis)
lis[0] = 'durant'
print(lis)
print(user)
'''
['james']
['durant']
james
'''

  而当我们将字典的内容,放到列表中,也是同理,修改列表中的内容,字典的内容也会发生改变:

dic = {
'a': ['user1', 'user2'],
'b': ['user3', 'user4']
}
lis = [] for i in dic.values():
lis.append(i)
lis[0][0] = 'user11111111'
print(dic)
# 结果如下:
# {'a': ['user11111111', 'user2'], 'b': ['user3', 'user4']}

  

  所以说,列表,字典,集合都是可变的数据类型。字符串,数字,元组均是不可变的数据类型。

  

二,登录认证程序

2.1 要求:

基础需求:

  1. 让用户输入用户名密码
  2. 认证成功后显示欢迎信息
  3. 输错三次后退出程序

升级需求:

  1. 可以支持多个用户登录 (提示,通过列表存多个账户信息)
  2. 用户3次认证失败后,退出程序
  3. 再次启动程序尝试登录时,还是锁定状态(提示:需把用户锁定的状态存到文件里)

2.2 简单的认证程序

  这种代码可以完成任务,但是代码比较冗余,如果账号密码比较多,就炸了,但是还是实现了简单的认证程序。

vip_username = ['james','wade','park','harden']
vip_password = ['123456','234567','345678','456789']
count = 0 while True:
username =input("请输入你的用户名:")
if username not in vip_username:
print("您所输入的用户不存在")
continue
else:
with open("lock_name.txt", 'r+') as userlock:
name_list = userlock.read()
if username in name_list:
print(username + "该用户已经被锁定")
break
password = input("请输入你的密码:") if username==vip_username[0] and password ==vip_password[0]:
print("恭喜"+username+"登陆成功")
break
elif username==vip_username[1] and password ==vip_password[1]:
print("恭喜" + username + "登陆成功")
break
elif username == vip_username[2] and password == vip_password[2]:
print("恭喜" + username + "登陆成功")
break
elif username == vip_username[3] and password == vip_password[3]:
print("恭喜" + username + "登陆成功")
break
else:
count+=1
print('用户密码错误,请你仔细核对')
if count>=3:
with open("lock_name.txt","a") as worryname:
worryname.write(username+","+"\n")
print("输入密码错误次数过多,%s已经被锁定"%username)
break

  

2.3 完善上面的代码

  上面代码有冗余的代码,我们这里修改一下,当然只针对上面代码修改:

username = ['user1', 'user2', 'user3', 'user4']
password = ['121', '122', '123', '124']
count = 0 # 为了方便,首先我们将username和password打包在一个字典里面
userinfo = {}
for i in range(len(username)):
userinfo[username[i]] = password[i]
# print(userinfo) # {'user1': '121', 'user2': '122', 'user3': '123', 'user4': '124'}
while True:
inp = input("请输入您的VIP账号名:\n")
if inp not in username:
print("您好,您输入的账号有误,请重新输入")
continue
else:
with open('lock_name.txt', 'r+') as userlock:
name_list = userlock.read()
if inp in name_list:
print(inp + ' : 您已经被被锁定')
break
pwd = input("请输入您的密码:\n")
if pwd == userinfo[inp]:
print("登录成功")
break
else:
print("密码错误,请重新输入")
count += 1
if count >= 3:
with open('lock_name.txt', 'a') as worryname:
worryname.write(username + ',' + '\n')
print("输入密码错误次数过多,%s已经被锁定" % username)
break

  上面代码其实是把Python基础学完后补充的,也算是对这篇博客进行完善吧。

三级菜单的实现(python程序)的更多相关文章

  1. python第四天 三级菜单新思路

    今天是一个坎,在做三级菜单时卡住了,因为想要简洁的代码,就要用到递归函数,卡的不要不要的!不过最后在同学老师的提点帮助下,还是解决了! 2017-5-10发现之前的代码有BUG今天 修改了! 作业要求 ...

  2. Python学习第二天-编写三级菜单

    编写三级菜单:1. 运行程序输出第一级菜单2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单3. 菜单数据保存在文件中4. 让用户选择是否要退出5. 有返回上一级菜单的功能 # Author: z ...

  3. python学习(10)字典学习,写一个三级菜单程序

    学习了字典的应用.按老师的要求写一个三级菜单程序. 三级菜单程序需求如下: 1.深圳市的区--街道--社区---小区4级 2.建立一个字典,把各级区域都装进字典里 3.用户可以从1级进入2级再进入3级 ...

  4. python成长之路-----day1-----作业(登录程序和三级菜单)

    作业: 作业1:用户登录 1)程序说明: a.用户输入密码验证成功然后打印欢迎信息 b.如果密码错误,用户登录失败,提示用户,密码错误 c.用户输入密码错误3次,则用户锁定 d.当用户多次输入不存在的 ...

  5. python 小程序—三级菜单—循环和字典练习

    程序中利用多级字典来存储三级菜单, 通过一系列while循环和for循环,实现了三级菜单的查询,选择,退回上级菜单,退出程序几个功能. 缺点:程序语句过于重复,效率低. #-*-coding:utf- ...

  6. Python初学者第十三天 三级菜单程序小作业

    13day 作业题目: 三级菜单 作业需求: 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村' ...

  7. python打怪之路【第三篇】:利用Python实现三级菜单

    程序: 利用Python实现三级菜单 要求: 打印省.市.县三级菜单 可返回上一级 可随时退出程序 coding: menu = { '北京':{ '朝阳':{ '国贸':{ 'CICC':{}, ' ...

  8. python 购物车和三级菜单

    程序:购物车程序 需求: 启动程序后,让用户输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时退出,退出时,打印已购买商品和余额 ...

  9. python三级菜单的实现

    一.作业要求 1.使用字典实现三级菜单功能 2.直接输入前面数字进入下一级菜单 3.按B返回上一级,按Q退出 二.需要知识点 1.if循环 2.for循环,enumerate的用法 3.while循环 ...

随机推荐

  1. Java中Lock,tryLock,lockInterruptibly的区别

    转载自:https://www.zhihu.com/question/36771163/answer/68974735 ReentrantLock 锁有好几种,除了常用的lock ,tryLock , ...

  2. cycript

    cycript是大神saurik开发的一个非常强大的工具,可以让开发者在命令行下和应用交互,在运行时查看和修改应用.它确实可以帮助你破解一些应用,但我觉得这个工具主要还是用来学习其他应用的设计(主要是 ...

  3. 【Linux init】systemd 服务单元管理

    系统服务管理systemd  Control the systemd system and service manager 控制systemd系统和服务管理,并行启动服务时充分发挥了多核处理器的性能, ...

  4. 【javascript】异步编年史,从“纯回调”到Promise

    异步和分块——程序的分块执行   一开始学习javascript的时候, 我对异步的概念一脸懵逼, 因为当时百度了很多文章,但很多各种文章不负责任的把笼统的描述混杂在一起,让我对这个 JS中的重要概念 ...

  5. Struts2-文件上传下载

    Struts2文件上传 提供 FileUpload 拦截器,用于解析 multipart/form-data 编码格式请求,解析上传文件的内容 fileUpload拦截器 默认在 defaultSta ...

  6. Python使用MySQL数据库(新)

    之前写过一篇 Python使用MySQL数据库的博客,主要使用的是Python2和MySQLdb驱动. python使用mysql数据库 然而,2016年开始,我从Python2切换到了Python3 ...

  7. 使用jmeter进行批量数据创建

    背景: 测试环境需要创建大量的测试数据,进行功能和性能的测试 测试数据创建接口是HTTP请求方式 测试数据要求不同类型的数据,要有字段进行关联,且单据的编号在DB中唯一不可重复,此外测试数据的时间类参 ...

  8. wifi pineapple 外接USB无线网卡桥接外网

    0:选择USB网卡 在没有有线网络的情况下,可以外挂一个usb无线网卡来桥接上网,目前支持3070L.8187L芯片的网卡,反正linux系统都用这些芯片, 免的安装驱动, 我选择的是 WN-722N ...

  9. 针对通达OA20170729集团版设计门户管理解决方案的具体实例

    随着企业信息化建设的深入,应用系统数量不断增加,应用功能不断丰富,数据信息也在呈几何级数增长,在支撑企业正常工作运转的同时,也衍生出许多新的问题: 通达信科根据自身从业多年的行业实践经验,勇于打破传统 ...

  10. 程序员也有春天之HTTP/2.0配置

    哎呀,一不小心自己的博客也是HTTP/2.0了,前段时间对网站进行了https迁移并上了CDN,最终的结果是这酱紫的(重点小绿锁,安全标示以及HTTP/2.0请求). 科普 随着互联网的快速发展,HT ...