Python作业之多级菜单
作业之多级菜单
菜单实现要求:
1. 列出菜单选择供选择
2. 选择对应内容进入下一级菜单
3. 任何时候都可以选择退出程序或返回上一级菜单
具体代码如下:
goods = {'华为':{'A系':{'A1':[1000,1100,1200,],'A2':[2000,2100,2200,],'A3':[3000,3100,3200,],},
'B系':{'B1':[4000,4200,4400,],'B2':[5000,5200,5400,],'B3':[6000,6200,6400,],},
'C系':{'C1':[7000,7300,7600,],'C2':[8000,8300,8600,],'C3':[9000,9300,9600,],},},
'小米':{'M系':{'M1':[610,630,650,],'M2':[710,730,750,],'M3':[810,830,850,],},
'N系':{'N1':[920,950,980,],'N2':[1020,1050,1080,],'N3':[1120,1150,1180],},
'L系':{'L1':[1230,1270,1300,],'L2':[1430,1470,1500,],'L3':[1630,1670,1700,],},},
'魅族':{'X系':{'X1':[599,699,799,],'X2':[699,799,899,],'X3':[799,899,999,],},
'Y系':{'Y1':[1099,1199,1299,],'Y2':[1299,1399,1499,],'Y3':[1499,1599,1699,],},
'Z系':{'Z1':[2099,2199,2299,],'Z2':[2399,2499,2599,],'Z3':[2699,2799,2899,],},},}
print('欢迎来到购物商城!'.center(30,'*'))
lie = [goods,]#声明一个列表,把上述的字典昨晚列表的元素
def goods_lie(goods,n):
'''该函数为多级菜单进入和返回的函数,函数有3个返回值,均是返回函数本事(调用递归)。'''
if n > 0:
while True:
for index,phone in enumerate(goods,1):#使用枚举函数遍历字典的键
print(index,phone)
print('温馨提示:\n1.选择商品编号进入下一级菜单\n2.选择B或者b返回上一级菜单\n3.选择Q或者q退出商城')
choice = input('请选择您要购买的商品编号进入下一级菜单:').strip()
if choice.isdigit():#判断输入的信息是否是纯数字
if int(choice) in range(1,4):
if type(goods) != dict:#判断传入的参数是否不是字典类型
print('商品的价格为%s已加入到购物车!'% goods[int(choice)-1])
back = input('已经最后一级菜单了,请选择返回或者退出!:').strip()
if back == 'B' or back == 'b':
return goods_lie(lie[n-1],n-1)#调用函数本身,获取上一次函数执行的结果
elif back == 'Q' or back == 'q':
break
else:
print('请选择返回或者退出!')
continue
else:
price = list(goods.keys())[int(choice)-1]#获取商品编号对应的商品
lie.append(goods[price])#把商品字典添加到列表中
print('您选择的商品是:',price)
return goods_lie(goods[price],n+1)#调用函数本身,进入下一级菜单
else:
print('商品编号不存在,请重新输入!')
continue
else:
if choice == 'B' or choice == 'b':
print('已返回上一级菜单!')
return goods_lie(lie[n-1],n-1)#调用函数本身,获取上一次函数执行的结果
elif choice == 'Q' or choice == 'q':
print('已退出购物商城!')
break
else:
print('您的输入有误,请重新输入!')
continue
ret = goods_lie(goods,1)#赋值并调用函数
注:该代码实现功能是:输入相应的编号进入下一级菜单或返回上一级菜单执行的结果,也可以虽然退出程序,使用了递归。
多级菜单优化版
import os
if not os.path.exists('d:\\users\\three_menu.txt'):
f = open('d:\\users\\three_menu.txt','w')
f.write('''{'华为':{'A系':{'A1':[1000,1100,1200,],'A2':[2000,2100,2200,],'A3':[3000,3100,3200,],},
'B系':{'B1':[4000,4200,4400,],'B2':[5000,5200,5400,],'B3':[6000,6200,6400,],},
'C系':{'C1':[7000,7300,7600,],'C2':[8000,8300,8600,],'C3':[9000,9300,9600,],},},
'小米':{'M系':{'M1':[610,630,650,],'M2':[710,730,750,],'M3':[810,830,850,],},
'N系':{'N1':[920,950,980,],'N2':[1020,1050,1080,],'N3':[1120,1150,1180],},
'L系':{'L1':[1230,1270,1300,],'L2':[1430,1470,1500,],'L3':[1630,1670,1700,],},},
'魅族':{'X系':{'X1':[599,699,799,],'X2':[699,799,899,],'X3':[799,899,999,],},
'Y系':{'Y1':[1099,1199,1299,],'Y2':[1299,1399,1499,],'Y3':[1499,1599,1699,],},
'Z系':{'Z1':[2099,2199,2299,],'Z2':[2399,2499,2599,],'Z3':[2699,2799,2899,],},},}''')
f.close()
with open('d:\\users\\three_menu.txt','r') as f:
menus = eval(f.read())#把文件中的内容读到内存中并转化为内存中的数据类型
print('欢迎来到购物商城!'.center(30,'*'))
menu = []#声明以空列表来存储上一级菜单
while True:
dic = {}#声明一个空字典,方便后续操作
for index,good in enumerate(menus,1):#使用枚举函数遍历字典的键
print(index,good)
dic[index] = good#把序号作为字典的key,商品名称作为字典的value传入该字典中
print('温馨提示:\n1.选择商品编号进入下一级菜单\n2.选择B或者b返回上一级菜单\n3.选择Q或者q退出商城')
if type(menus) == list:#判断要枚举的菜单是否是列表类型
choose = input('\033[31m请选择你要购买的商品编号:\033[0m').strip()
if choose.isdigit():#判断输入的是否是纯数字
if int(choose) <= len(menus):
print('您选择的%s已加入购物车!'% menus[int(choose)-1])
print('\033[31m最后一级菜单,只能返回和退出!\033[0m')
else:
print('out range')
else:
if choose == 'q' or choose == 'Q':
print('已退出购物商城!')
break
elif choose == 'b' or choose == 'B':
menus = menu[-1]#把菜单赋值给列表的最后一个元素
menu.pop()#删掉列表的最后一个元素
else:
print('error')
else:
choice = input('请选择您要购买的商品编号进入下一级菜单:').strip()
if choice.isdigit():
if int(choice) in dic.keys():
menu.append(menus)#把菜单添加到列表中
menus = menus[dic[int(choice)]]#重新赋值菜单
else:
print('range out')
else:
if choice == 'B' or choice == 'b':
print('由于当前处于首层菜单,因此本次返回将退出程序!')
if len(menu) < 1:break
menus = menu[-1]#把菜单赋值给列表的最后一个元素
menu.pop()#删掉列表的最后一个元素
elif choice == 'Q' or choice == 'q':
print('已退出购物商城!')
break
else:
print('您的输入有误,请重新输入!')
注:主要优化点为:
- 把菜单存储到文件中
- 简化代码
- 弃用递归(递归效率偏低)
Python作业之多级菜单的更多相关文章
- Python简单实现多级菜单
# -*- coding: utf-8 -*- # @Time : 2018-06-01 13:40 # @Author : 超人 # @Email : huxiaojiu111@gmail.com ...
- python作业:三级菜单(第一周)
一.作业需求: 1. 运行程序输出第一级菜单 2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单 3. 菜单数据保存在文件中 4. 让用户选择是否要退出 5. 有返回上一级菜单的功能 二.三级菜单 ...
- python作业设计:多级菜单,并可依次进入各级子菜单
'''作业三:多级菜单 三级菜单 可依次选择进入各子菜单 所需新知识点:列表.字典 ''' data = { "北京":{ "昌平":{ "沙河&qu ...
- 第2章 Python基础-字符编码&数据类型 购物车&多级菜单 作业
作业 一.三级菜单 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村':{ '爱奇艺':{}, ...
- Day1作业---登录接口及多级菜单
#!/usr/bin/env python # -*- coding:utf-8 -*- # Author:Ma Qing data = { "山东" :{ "济南&qu ...
- day1作业二:多级菜单操作
作业二:多级菜单 (1)三级菜单 (2)可以次选择进入各子菜单 (3)所需新知识点:列表.字典 要求:输入back返回上一层,输入quit退出整个程序 思路: (1)首先定义好三级菜单字典: (2)提 ...
- day1作业二:多级菜单操作(函数实现)
作业二:多级菜单 (1)三级菜单 (2)可以次选择进入各子菜单 (3)所需新知识点:列表.字典 要求:输入back返回上一层,输入quit退出整个程序 本示例的三级菜单是一个yaml文件格式,格式如下 ...
- python开发_tkinter_多级子菜单
在之前的blog中有提到python的tkinter中的菜单操作 python开发_tkinter_窗口控件_自己制作的Python IDEL_博主推荐 python开发_tkinter_窗口控件_自 ...
- Python多级菜单
作业2:多级菜单三级菜单可依次选择进入各子菜单所需新知识点:列表.字典 1.流程图 2.登录界面,输入对应索引 #!/usr/bin/env python3 # -*- coding:utf-8 -* ...
随机推荐
- Xamarin控件使用之ListView
listview单列多行的显示,以后再加多列多行的实例. [Activity(Label = "GraphicAll", LaunchMode = LaunchMode.Singl ...
- web信息泄露注意事项
1. 确保您的Web服务器不发送显示有关后端技术类型或版本信息的响应头. 2. 确保服务器打开的端口上运行的所有服务都不会显示有关其构建和版本的信息. 3. 确保所有目录的访问权限正确,保证不会让攻击 ...
- OpenShift实战(二):OpenShift节点扩容
1.新增节点信息 增加节点如下,请将xxx改为自己的域名 node6.xxx.net Node 192.168.8.90 8G 20G/60G 4C node7.xxx.net Node 192.16 ...
- 项目实战15—企业级堡垒机 jumpserver
本文收录在Linux运维企业架构实战系列 环境准备 系统:CentOS 7 IP:192.168.10.101 关闭selinux 和防火墙 # CentOS $ setenforce # 可以设置配 ...
- POJ-2996 Help Me with the Game---模拟棋子
题目链接: https://vjudge.net/problem/POJ-2996 题目大意: 给出白方和黑方的棋子和对应的坐标,输出该副棋盘的样子 1,棋盘中大写字母表示的是白方棋子,小写是黑方.2 ...
- java 面向对象编程。。。。
经过一周的学习(java),总结了许多,对java的理解,java的类型,运用,安装,基础语法,变量,常量,表达式,语句 java从C语言中继承了大量语言特性.java面向对象编程的基本特征,包括继承 ...
- angularJS的插件使用
$uibModal&&$uibModalInstance $uibModal和$uibModalInstance是一款angularJS的弹窗控件,github地址 http://an ...
- Python3NumPy——数组(2)之数学空间与NumPy空间
0 介绍 本文承接上一篇,文章采用新的阐述方式,将数学中的表达与NumPy中的函数关联起来. 采用这种方式,可以直接建立数学表达与计算系统的对应关系,更易理解. 由于博客编写时间有限,每次尝试一个知识 ...
- Java进阶篇(二)——抽象类、内部类
之前在类和对象中我们说到了类的普通特性,本篇将介绍类的一些高级特性. 一.抽象类 抽象类:抽象类是只声明方法的存在而不去具体实现它的类.抽象类不能被实例化,也就是不能创建其对象.使用abstract关 ...
- Node.js系列文章:如何进行代码调试
使用任何一门编程语言,都少不了代码调试这一功能.我们在使用JavaScript编写浏览器端代码时,Chrome提供了强大的调试工具Dev Tools,但是在编写Node.js代码时,大多数人最开始都使 ...