给大家整理一下三级菜单的三种实现方法:
第一种 普通版 (代码较多,但是逻辑清晰)
1 menu = { 2 '北京': { 3 '海淀': { 4 '五道口': { 5 'soho': {}, 6 '网易': {}, 7 'google': {} 8 }, 9 '中关村': {10 '爱奇艺': {},11 '汽车之家': {},12 'youku': {},13 },14 '上地': {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 while True:45 for k in menu:46 print(k)47 choice = input('>:').strip()48 if not choice:49 continue50 if choice in menu:51 while True:52 for k in menu[choice]:53 print(k)54 choice2 = input('>>:').strip()55 if not choice2:56 continue57 if choice2 in menu[choice]:58 while True:59 for k in menu[choice][choice2]:60 print(k)61 choice3 = input('>>>:').strip()62 if not choice3:63 continue64 if choice3 in menu[choice][choice2]:65 print('go to', menu[choice][choice2][choice3])66 elif choice3 == 'b':67 break68 elif choice3 == 'q':69 exit('bye.')70 else:71 print('节点不存在')72 elif choice2 == 'b':73 break74 elif choice2 == 'q':75 exit('bye.')76 else:77 print('节点不存在')78 79 else:80 print('节点不存在')
第二种 简洁版(代码相对较少,只有一个while循环)
1 # -*- coding:utf-8 -*- 2 menu = { 3 '北京': { 4 '海淀': { 5 '五道口': { 6 'soho': {}, 7 '网易': {}, 8 'google': {} 9 },10 '中关村': {11 '爱奇艺': {},12 '汽车之家': {},13 'youku': {},14 },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 gradually = [] # #将上一层key值放入到列表中46 menu_list = menu47 while True:48 for k in menu_list:49 print(k)50 choose = input('>:').strip()51 if not choose:52 continue53 if choose in menu_list:54 gradually.append(menu) # 将当前的状态放入列表中55 menu_list = menu_list[choose]56 if len(menu_list) == 0:57 print('这里面已经没有东西了,请按“b”返回上级或按“q”退出')58 elif choose == 'b':59 if len(gradually) == 0:60 print('已经是顶层!')61 else:62 menu_list = gradually.pop() # 删除最后的数据实现返回上一层的功能63 64 elif choose == 'q':65 exit('退出成功.')66 else:67 print('您输入的内容不存在,请按列表内容输入')
第三种 递归版 (代码简洁,先对来说思路较难)
这里用到了递归函数,先来简单说一下递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归函数特性:
-
- 必须有一个明确的结束条件;
- 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
- 相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
- 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
# 例如:1加到100的实现def func(n): if n == 1: return 1 return n + func(n - 1)print(func(100))
下面看一下三级菜单的递归版
1 menu = { 2 '北京': { 3 '海淀': { 4 '五道口': { 5 'soho': {}, 6 '网易': {}, 7 'google': {} 8 }, 9 '中关村': {10 '爱奇艺': {},11 '汽车之家': {},12 'youku': {},13 },14 '上地': {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 def menu_list(a):47 for k in a:48 print(k)49 choose = input('请按列表内容输入(按q退出,按b返回)>:').strip()50 if choose in a:51 menu_list(a[choose])52 elif choose == 'q':53 exit('退出成功.')54 elif choose == 'b':55 if a != menu:56 return57 else:58 print('已经是顶层啦!')59 menu_list(a)60 else:61 print('您输入的内容不存在,请按列表内容输入')62 menu_list(a)63 64 65 menu_list(menu)