今天是一个坎,在做三级菜单时卡住了,因为想要简洁的代码,就要用到递归函数,卡的不要不要的!不过最后在同学老师的提点帮助下,还是解决了!
2017-5-10发现之前的代码有BUG今天 修改了!
作业要求:
三级菜单:
1. 运行程序输出第一级菜单
2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单
3. 菜单数据保存在文件中
文件操作还没有学到,暂时做到1,2两点,第3点明后天补上!
照旧,先上一下流程图:
详细代码:
1 #!usr/bin/env python 2 #-*-coding:utf-8-*- 3 # Author calmyan 4 menu_file=open("menu.txt",'r',encoding='utf-8')#打开菜单文件 5 info=eval(menu_file.readline())#转换菜单文件中的字符串 6 global conut,_tab,exit_flag 7 8 _tab=' ' 9 10 exit_flag = True 11 def menu_open(info):#递归函数 传入下一层菜单 12 global exit_flag,conut#声明全局变量 13 exit_flag=True#先为真 14 while exit_flag: 15 conut+=1 16 _tab2=_tab.expandtabs(tabsize=(conut*3))#为了增加菜单的可读性,按层级来加tab键 17 for i in info: 18 print(_tab2,i) 19 if conut==4: 20 name=input("当前为第 33[35;1m%s 33[0m是最后一层 按B/b返回<<< 按Q/q退出:"%conut) 21 name=name.strip() 22 if name=='b' or name=='B': 23 conut-=2#因数进行循环就加一,所以需要减2 24 break 25 elif name=='Q' or name=='q': 26 print("你已经退出菜单!") 27 exit_flag=False 28 break 29 else: 30 conut-=1 31 print("你输入的目录不存在!") 32 continue 33 if conut<4:#判断菜单层级不是最底层加一 34 name=input("当前为第 33[32;1m%s 33[0m 层,请输入名称进入下一层>>> 按B/b返回<<< 按Q/q退出:"% conut) 35 name=name.strip() 36 if name=='b' or name=='B': 37 conut-=2#因数进行循环就加一,所以需要减2 38 break 39 elif name=='Q' or name=='q': 40 print("你已经退出菜单!") 41 exit_flag=False 42 break 43 elif name in info:#如果存在并不是最后一层则调用函数 44 menu_open(info[name]) 45 else: 46 conut-=1 47 print("你输入的目录不存在!") 48 continue 49 50 while exit_flag: 51 for i in info: 52 print(i) 53 conut=1 54 name=input("当前为第 33[32;1m %s 33[0m 层,请输入名称进入下一层>>> 按Q/q退出:"%conut) 55 name=name.strip() 56 if name=='Q' or name=='q': 57 print("你已经退出菜单!") 58 exit_flag=False 59 elif name in info: 60 61 menu_open(info[name]) 62 else: 63 print("你输入的目录不存在!") 64 continue
菜单内容比较少,将就着吧,回头有空再让它丰满起来!
1 #以下代码复制到python(3.6.2rc2)下 按F5 可以正常执行,对比学习。#QQ:124111294欢迎交流py 2 #三级菜单 3 menu = { 4 '北京':{ 5 '海淀':{ 6 '五道口':{ 7 'soho':{}, 8 '网易':{}, 9 'google':{} 10 }, 11 '中关村':{ 12 '爱奇艺':{}, 13 '汽车之家':{}, 14 'youku':{}, 15 }, 16 '上地':{ 17 '百度':{}, 18 }, 19 }, 20 '昌平':{ 21 '沙河':{ 22 '老男孩':{}, 23 '北航':{}, 24 }, 25 '天通苑':{}, 26 '回龙观':{}, 27 }, 28 '朝阳':{}, 29 '东城':{}, 30 }, 31 '上海':{ 32 '闵行':{ 33 "人民广场":{ 34 '炸鸡店':{} 35 } 36 }, 37 '闸北':{ 38 '火车战':{ 39 '携程':{} 40 } 41 }, 42 '浦东':{}, 43 }, 44 '山东':{}, 45 } 46 47 # while not exit_flag <如果条件为假执行循环> 48 # for k in current_layer <条件循环> 49 # print(k) <打印> 50 # input<输入> 51 # .strip()#strip([chars]) <删除字符串前边和后边所有的空格,chars参数可以指定删除的字符,可选> 52 # if <条件判断> 53 # layers.pop() <删除> 54 # elif choice not in <条件判断> 55 # continue <跳出本次循环,重新循环> 56 # else <否则,当if条件不成立时执行> 57 # .append<附加> 58 # choice<选择> 59 60 exit_flag = False 61 current_layer = menu 62 63 layers = [menu] 64 65 while not exit_flag: 66 for k in current_layer: 67 print(k) 68 choice = input(">>:").strip() 69 if choice == "b": 70 current_layer = layers[-1] 71 #print("change to laster", current_layer) 72 layers.pop() 73 elif choice not in current_layer:continue 74 else: 75 layers.append(current_layer) 76 current_layer = current_layer[choice] 77 78 #以下代码复制到python(3.6.2rc2)下 按F5 可以正常执行,对比学习。QQ:124111294欢迎交流py