python全栈开发---三级菜单
给大家整理一下三级菜单的三种实现方法:
第一种 普通版 (代码较多,但是逻辑清晰)
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 continue 50 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 continue 57 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 continue 64 if choice3 in menu[choice][choice2]: 65 print('go to', menu[choice][choice2][choice3]) 66 elif choice3 == 'b': 67 break 68 elif choice3 == 'q': 69 exit('bye.') 70 else: 71 print('节点不存在') 72 elif choice2 == 'b': 73 break 74 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 = menu 47 while True: 48 for k in menu_list: 49 print(k) 50 choose = input('>:').strip() 51 if not choose: 52 continue 53 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 return 57 else: 58 print('已经是顶层啦!') 59 menu_list(a) 60 else: 61 print('您输入的内容不存在,请按列表内容输入') 62 menu_list(a) 63 64 65 menu_list(menu)

浙公网安备 33010602011771号