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('节点不存在')
View Code

 

第二种 简洁版(代码相对较少,只有一个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('您输入的内容不存在,请按列表内容输入')
View Code

 

第三种  递归版 (代码简洁,先对来说思路较难)

这里用到了递归函数,先来简单说一下递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。

递归函数特性:

    1. 必须有一个明确的结束条件;
    2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
    3. 相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
    4. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(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)

 

posted @ 2018-04-18 15:45  devilwolf  阅读(75)  评论(0)    收藏  举报