三级菜单的实现(python程序)
这是刚开始写程序,三级菜单的程序基本是用字典实现,很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 要求:
基础需求:
- 让用户输入用户名密码
- 认证成功后显示欢迎信息
- 输错三次后退出程序
升级需求:
- 可以支持多个用户登录 (提示,通过列表存多个账户信息)
- 用户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程序)的更多相关文章
- python第四天 三级菜单新思路
今天是一个坎,在做三级菜单时卡住了,因为想要简洁的代码,就要用到递归函数,卡的不要不要的!不过最后在同学老师的提点帮助下,还是解决了! 2017-5-10发现之前的代码有BUG今天 修改了! 作业要求 ...
- Python学习第二天-编写三级菜单
编写三级菜单:1. 运行程序输出第一级菜单2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单3. 菜单数据保存在文件中4. 让用户选择是否要退出5. 有返回上一级菜单的功能 # Author: z ...
- python学习(10)字典学习,写一个三级菜单程序
学习了字典的应用.按老师的要求写一个三级菜单程序. 三级菜单程序需求如下: 1.深圳市的区--街道--社区---小区4级 2.建立一个字典,把各级区域都装进字典里 3.用户可以从1级进入2级再进入3级 ...
- python成长之路-----day1-----作业(登录程序和三级菜单)
作业: 作业1:用户登录 1)程序说明: a.用户输入密码验证成功然后打印欢迎信息 b.如果密码错误,用户登录失败,提示用户,密码错误 c.用户输入密码错误3次,则用户锁定 d.当用户多次输入不存在的 ...
- python 小程序—三级菜单—循环和字典练习
程序中利用多级字典来存储三级菜单, 通过一系列while循环和for循环,实现了三级菜单的查询,选择,退回上级菜单,退出程序几个功能. 缺点:程序语句过于重复,效率低. #-*-coding:utf- ...
- Python初学者第十三天 三级菜单程序小作业
13day 作业题目: 三级菜单 作业需求: 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村' ...
- python打怪之路【第三篇】:利用Python实现三级菜单
程序: 利用Python实现三级菜单 要求: 打印省.市.县三级菜单 可返回上一级 可随时退出程序 coding: menu = { '北京':{ '朝阳':{ '国贸':{ 'CICC':{}, ' ...
- python 购物车和三级菜单
程序:购物车程序 需求: 启动程序后,让用户输入工资,然后打印商品列表 允许用户根据商品编号购买商品 用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒 可随时退出,退出时,打印已购买商品和余额 ...
- python三级菜单的实现
一.作业要求 1.使用字典实现三级菜单功能 2.直接输入前面数字进入下一级菜单 3.按B返回上一级,按Q退出 二.需要知识点 1.if循环 2.for循环,enumerate的用法 3.while循环 ...
随机推荐
- python 如何在一个for循环中遍历两个列表
是我在看<笨方法学python>过程中发现有一行代码看不懂--" for sentence in snippet, phrase:",所以研究了半天,感觉挺有收获的.所 ...
- LxNx前端F2F面试问题整理
LxNx前端面试问题: 1. 你用过前端哪些框架?它们项目中会用到Angular.js Backbone.js 我回答jQuery, bootstrap, 而Augular.js只是学过 2. 那既然 ...
- mysql my.ini配置文件修改无效,修改mysql默认字符集
问题 开始于 使用mysql命令插入中文数据插不进去 ERROR 1366 (HY000): Incorrect string value: '\xD6\xD0\xCE\xC4' for column ...
- Netty SSL安全配置
Netty SSL安全配置 [TOC] 摘要 在研发蜂鸟部署平台的过程中,涉及到平台网关和前置agent的通信加密,虽然目前软件在内网中,但是由于蜂鸟平台和agent的特殊性,一旦被控制,部署的软件就 ...
- 7.28.1 Spring构造注入还是设置注入
1. 构造方法注入代码如下:public UserManagerImpl(UserDao userDao) { ...
- 在fetch方法中添加header后遇到的预检请求问题
今天在使用fetch方法 fetch('xxx.com',{header:{bbbbbbb:111}}) 浏览器返回的请求信息中,header变成了 :authority:koss.nocorp.me ...
- Struts2使用小问题-NoSuchFieldException
五月 12, 2017 4:55:14 下午 com.opensymphony.xwork2.util.logging.jdk.JdkLogger warn 警告: couldn't clear to ...
- shell之 printf 输出语句
总结: (1)printf 使用引用文本或空格分隔的参数,外面可以在printf中使用格式化字符串,还可以制定字符串的宽度.左右对齐方式等.默认printf不会像 echo 自动添加换行符,我们可以手 ...
- 为什么内存使用2G的苹果手机比内存使用4G的安卓机更流畅?
这是在国外一家网站看到的,分析得不错,原文如下: Why does the iPhone require less RAM than Android devices? There are people ...
- 常用的十大Python开发工具
据权威机构统计,Python人才需求量每日高达5000+,但目前市场上会 Python 的程序员少之又少, 竞争小,很容易快速高薪就业.可能你并不太了解常用的十大Python开发工具都有哪些,现在告诉 ...