day21 04 三級菜單 對每次用戶輸入與調用進行詳細展開分析: 運行結果: 其中比較繞的地方就是當用戶輸入b和q的時候了: 用戶輸入b 返回上一級菜單:利用給調用的地方(上一級菜單)返回一個值b,然後結束語句,就在上一級繼續迴圈 用戶輸入q 退出程式:通過一層一層的返回q值,知道退出程式 2.使 ...
day21 04 三級菜單
1.使用遞歸調用的方法
整體代碼類型比較簡單如下:
menu={'北京':{'海澱':{'a':{},'h':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龍觀':{}},'朝陽':{},'東城':{}} ,'上海':{'閔行':{'d':{},'f':{},'g':{}},'闡北':{},'浦東':{}} ,'山東':{}} l=[menu] def threeLM(dic): while True: for key in dic:print(key) key=input('input>>').strip() if key=='b' or key=='q':return key elif key in dic.keys() and dic[key]: ret=threeLM(dic[key]) if ret=='q':return 'q' threeLM(menu)
對每次用戶輸入與調用進行詳細展開分析:
#第一次調用:dic=menu def threeLM(dic): while True:#進來就是死迴圈 for key in dic:print(key) #1. 列印 北京 上海 山東 key=input('input>>').strip() #2. 用戶輸入 北京 上海 山東 其中一個,假設輸入北京 #6.用戶輸入 列印 海澱 昌平 朝陽 東城 其中一個,假設輸入昌平 if key=='b' or key=='q':return key elif key in dic.keys() and dic[key]: #3. 輸入的key在字典裡面,且字典不為空 ret=threeLM(dic[key]) #4. 再次調用函數,把輸入的字典傳進去,比如輸入北京則將 #18 接收#17返回的q ret=q # {'海澱':{'a':{},'b':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龍觀':{}},'朝陽':{},'東城':{}} # 這個字典傳進去,再次迴圈 if ret=='q':return 'q' #19 return q 函數就結束了,所以用戶輸入q結果就是退出程式 threeLM(menu) #第二次調用:dic={'海澱':{'a':{},'b':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龍觀':{}},'朝陽':{},'東城':{}} def threeLM(dic): while True:#進來就是死迴圈 for key in dic:print(key) #5. 列印 海澱 昌平 朝陽 東城 #13 elif語句結束後 又開始迴圈,列印 海澱 昌平 朝陽 東城,所以#10的地方輸入b結果就是返回上一級菜單 key=input('input>>').strip() #6. 用戶輸入 列印 海澱 昌平 朝陽 東城 其中一個,假設輸入昌平 if key=='b' or key=='q':return key elif key in dic.keys() and dic[key]: #7. 輸入的key在字典裡面,且字典不為空 ret=threeLM(dic[key])#8. 再次調用函數,把輸入的字典{'沙河':{},'天通苑':{},'回龍觀':{}}傳進去,再次迴圈 #12 接收#11返回的值,ret=b 不符合下麵的if條件,所以elif語句結束了 #16 接收#15返回的值,ret=q 符合下麵的if語句 if ret=='q':return 'q' #17 將q返回上個調用的地方,即#4的地方 threeLM(menu) #第三次調用:dic={'沙河':{},'天通苑':{},'回龍觀':{}} def threeLM(dic): while True:#進來就是死迴圈 for key in dic:print(key) #9. 列印 沙河 天通苑 回龍觀 key=input('input>>').strip() #10. 假設用戶輸入的是b #14 假設用戶在這裡輸入q if key=='b' or key=='q':return key #11. return b 給前面調用的地方即‘#8’的地方 #15 return q給前面調用的地方 elif key in dic.keys() and dic[key]: ret=threeLM(dic[key]) if ret=='q':return 'q' threeLM(menu)
運行結果:
C:\Users\sku1-1\PycharmProjects\untitled\venv\Scripts\python.exe "C:/Users/sku1-1/PycharmProjects/untitled/day 21 04 三級菜單.py" 山東 北京 上海 input>>北京 昌平 海澱 東城 朝陽 input>>海澱 a c h input>>b 昌平 海澱 東城 朝陽 input>>q Process finished with exit code 0
其中比較繞的地方就是當用戶輸入b和q的時候了:
用戶輸入b----返回上一級菜單:利用給調用的地方(上一級菜單)返回一個值b,然後結束語句,就在上一級繼續迴圈
用戶輸入q----退出程式:通過一層一層的返回q值,知道退出程式
2.使用堆棧的方法
代碼如下:
menu={'北京':{'海澱':{'a':{},'h':{},'c':{}},'昌平':{'沙河':{},'天通苑':{},'回龍觀':{}},'朝陽':{},'東城':{}} ,'上海':{'閔行':{'d':{},'f':{},'g':{}},'闡北':{},'浦東':{}} ,'山東':{}} l=[menu] #首先有一個棧 while True: for key in l[-1]:print(key)#l[-1]是最後一個值,從最後一個開始列印,先進後出 l[-1]=menu 列印北京 上海 山東 k=input('input>>').strip() #用戶輸入北京 if k in l[-1].keys() and l[-1][key]:#判斷輸入的在不再字典當中以及是不是為空,如果為真執行下麵的代碼 l.append(l[-1][k]) #將北京的字典放入l中,此時l=[menu,{海澱。。。。}],再while True 迴圈,又取的最後一個 #如果知道這裡已經可以進去了,但是出不去 elif k=='b': l.pop() #把這一級菜單刪除,直接就返回上級菜單 elif k=='q':break #用戶輸入q退出程式 else:continue
運行結果:
C:\Users\sku1-1\PycharmProjects\untitled\venv\Scripts\python.exe C:/Users/sku1-1/PycharmProjects/untitled/三級菜單.py 山東 北京 上海 input>>北京 東城 昌平 朝陽 海澱 input>>昌平 沙河 天通苑 回龍觀 input>>b 東城 昌平 朝陽 海澱 input>>q Process finished with exit code 0
返回上一級菜單所作的操作:把原來所在的本級菜單直接刪除,就剩下上一級菜單了