要求:
1.可以进入子菜单
2.可以返回上一级
3.可以从任意一级直接退出
遇到的困难:
- 如何返回上一级(三种里用了return,break,和全局变量三种)
- 怎么在最上一层时按'b'(返回)能保持不动,在最后一层时继续输入下一个能不出错
字典的多级嵌套:[key for key in data] >>>['山东','江苏'] ,用循环遍历多级字典时只会返回一级,用[key for key in data['山东']]>>['青岛',‘济南’,‘烟台’]
基础版:
data = { '山东': { '青岛': ['四方', '黄岛', '崂山', '李沧', '城阳'], '济南': ['历城', '槐荫', '高新', '长青', '章丘'], '烟台': ['龙口', '莱山', '牟平', '蓬莱', '招远'] }, '江苏': { '苏州': ['沧浪', '相城', '平江', '吴中', '昆山'], '南京': ['白下', '秦淮', '浦口', '栖霞', '江宁'], '无锡': ['崇安', '南长', '北塘', '锡山', '江阴'] }, } exit_flag = False # 设置全局变量,用来退出循环,实现任意一级菜单都可以退出 while not exit_flag: for i1 in data: # 读取第一级菜单 print(i1) choice = input('选择进入1,第一级,按q退出:') if choice in data: while not exit_flag: for i2 in data[choice]: # 读取第二级菜单 print(i2) choice2 = input('选择进入2,按b返回上一级,按q退出:') if choice2 in data[choice]: while not exit_flag: for i3 in data[choice][choice2]: # 读取第三级菜单 print(i3) choice3 = input('选择进入3,按b返回上一级,按q退出:') if choice3 in data[choice][choice2]: for i4 in data[choice][choice2][choice3]: print(i4) choice4 = input('最后一层,按b返回上一级,按q退出:') if choice4 == 'b': pass # 占位符 if choice4 == 'q': exit_flag = True if choice3 == 'b': break if choice3 == 'q': exit_flag = True if choice2 == 'b': break if choice2 == 'q': exit_flag = True if choice == 'q': exit_flag = True
递归版:
# 用递归写三级菜单
# 此程序有两个问题,一是最顶端时输入“b”会直接退出,二是到最后一层再往下输时也会出错# 用递归写三级菜单 # 此程序有两个问题,一是最顶端时返回会出错,二是到最后一层再往下输时也会出错 def fact_dict(logs, counts): while True: print('请输入进入地区,输入b返回上层菜单,输入q退出'.center(40, '-')) name_lst = [key for key in logs] print('\n'.join(name_lst)) print(type(logs)) choice = input('\033[31;m请选择:\033[0m') if choice in name_lst: fact_dict(logs[choice]) elif choice == 'b': # 返回上一级菜单 return # return表示返回上一级 elif choice == 'q': exit() else: print("Input Error") if __name__ == '__main__': log = { '山东': { '青岛': ['四方', '黄岛', '崂山', '李沧', '城阳'], '济南': ['历城', '槐荫', '高新', '长青', '章丘'], '烟台': ['龙口', '莱山', '牟平', '蓬莱', '招远'] }, '江苏': { '苏州': ['沧浪', '相城', '平江', '吴中', '昆山'], '南京': ['白下', '秦淮', '浦口', '栖霞', '江宁'], '无锡': ['崇安', '南长', '北塘', '锡山', '江阴'] }, } fact_dict(log, count)
类+递归版(借鉴的别人的,个人比较喜欢这版):
- 到第三层时,会直接输出第三层后继续输出第二层(解决了输出最后一层再往下输可能会出错的问题,但是解决方式不喜欢,换)
- 解决了第一层输入“b”会出错的问题(感觉很强!定义一个self.menus=menu,则self.menus保持不变,一直都是最开始的字典)
class menu(object): def __init__(self, menus): self.menus = menus def view_dict(self, menu): print('请输入进入地区,输入"b"返回上层菜单,输入"q"退出'.center(40, '-')) print('\n'.join([str(key) for key in menu])) choice = input("请选择>>:") if choice == 'q': exit() elif choice == 'b': if menu != self.menus: #self.menus是最开始的menu,表示那个多级字典 return else: print('已经是最顶层目录,请选择或退出,谢谢'.center(40, ' ')) self.view_dict(menu) elif choice in [key for key in menu]: if type(menu[choice]).__name__ == 'dict': self.view_dict(menu[choice]) self.view_dict(menu) else: print('\n'.join([item for item in menu[choice]])) print('已经是最后一层,返回请输入"b",退出请输入"q",谢谢!'.center(40, '*')) self.view_dict(menu) else: print('请输入正确口令,谢谢!') self.view_dict(menu) if __name__ == '__main__': zone = { '山东': { '青岛': ['四方', '黄岛', '崂山', '李沧', '城阳'], '济南': ['历城', '槐荫', '高新', '长青', '章丘'], '烟台': ['龙口', '莱山', '牟平', '蓬莱', '招远'] }, '江苏': { '苏州': ['沧浪', '相城', '平江', '吴中', '昆山'], '南京': ['白下', '秦淮', '浦口', '栖霞', '江宁'], '无锡': ['崇安', '南长', '北塘', '锡山', '江阴'] }, } view = menu(zone) view.view_dict(zone)