Python作業之多級菜單


                                                  作業之多級菜單

菜單實現要求:

1. 列出菜單選擇供選擇

2. 選擇對應內容進入下一級菜單

3. 任何時候都可以選擇退出程序或返回上一級菜單

具體代碼如下:

goods = {'華為':{'A系':{'A1':[1000,1100,1200,],'A2':[2000,2100,2200,],'A3':[3000,3100,3200,],},
                 'B系':{'B1':[4000,4200,4400,],'B2':[5000,5200,5400,],'B3':[6000,6200,6400,],},
                 'C系':{'C1':[7000,7300,7600,],'C2':[8000,8300,8600,],'C3':[9000,9300,9600,],},},
           '小米':{'M系':{'M1':[610,630,650,],'M2':[710,730,750,],'M3':[810,830,850,],},
                 'N系':{'N1':[920,950,980,],'N2':[1020,1050,1080,],'N3':[1120,1150,1180],},
                 'L系':{'L1':[1230,1270,1300,],'L2':[1430,1470,1500,],'L3':[1630,1670,1700,],},},
           '魅族':{'X系':{'X1':[599,699,799,],'X2':[699,799,899,],'X3':[799,899,999,],},
                 'Y系':{'Y1':[1099,1199,1299,],'Y2':[1299,1399,1499,],'Y3':[1499,1599,1699,],},
                 'Z系':{'Z1':[2099,2199,2299,],'Z2':[2399,2499,2599,],'Z3':[2699,2799,2899,],},},}
print('歡迎來到購物商城!'.center(30,'*'))
lie = [goods,]#聲明一個列表,把上述的字典昨晚列表的元素
def goods_lie(goods,n):
    '''該函數為多級菜單進入和返回的函數,函數有3個返回值,均是返回函數本事(調用遞歸)。'''
    if n > 0:
        while True:
            for index,phone in enumerate(goods,1):#使用枚舉函數遍歷字典的鍵
                print(index,phone)
            print('溫馨提示:\n1.選擇商品編號進入下一級菜單\n2.選擇B或者b返回上一級菜單\n3.選擇Q或者q退出商城')
            choice = input('請選擇您要購買的商品編號進入下一級菜單:').strip()
            if choice.isdigit():#判斷輸入的信息是否是純數字
                if int(choice) in range(1,4):
                    if type(goods) != dict:#判斷傳入的參數是否不是字典類型
                        print('商品的價格為%s已加入到購物車!'% goods[int(choice)-1])
                        back = input('已經最后一級菜單了,請選擇返回或者退出!:').strip()
                        if back == 'B' or  back == 'b':
                            return goods_lie(lie[n-1],n-1)#調用函數本身,獲取上一次函數執行的結果
                        elif back == 'Q' or back == 'q':
                            break
                        else:
                            print('請選擇返回或者退出!')
                            continue
                    else:
                        price = list(goods.keys())[int(choice)-1]#獲取商品編號對應的商品
                        lie.append(goods[price])#把商品字典添加到列表中
                        print('您選擇的商品是:',price)
                        return goods_lie(goods[price],n+1)#調用函數本身,進入下一級菜單
                else:
                    print('商品編號不存在,請重新輸入!')
                    continue
            else:
                if choice == 'B' or choice == 'b':
                    print('已返回上一級菜單!')
                    return goods_lie(lie[n-1],n-1)#調用函數本身,獲取上一次函數執行的結果
                elif choice == 'Q' or choice == 'q':
                    print('已退出購物商城!')
                    break
                else:
                    print('您的輸入有誤,請重新輸入!')
                    continue
ret = goods_lie(goods,1)#賦值並調用函數

注:該代碼實現功能是:輸入相應的編號進入下一級菜單或返回上一級菜單執行的結果,也可以雖然退出程序,使用了遞歸。

多級菜單優化版

import os
if not os.path.exists('d:\\users\\three_menu.txt'):
    f = open('d:\\users\\three_menu.txt','w')
    f.write('''{'華為':{'A系':{'A1':[1000,1100,1200,],'A2':[2000,2100,2200,],'A3':[3000,3100,3200,],},
                     'B系':{'B1':[4000,4200,4400,],'B2':[5000,5200,5400,],'B3':[6000,6200,6400,],},
                     'C系':{'C1':[7000,7300,7600,],'C2':[8000,8300,8600,],'C3':[9000,9300,9600,],},},
               '小米':{'M系':{'M1':[610,630,650,],'M2':[710,730,750,],'M3':[810,830,850,],},
                     'N系':{'N1':[920,950,980,],'N2':[1020,1050,1080,],'N3':[1120,1150,1180],},
                     'L系':{'L1':[1230,1270,1300,],'L2':[1430,1470,1500,],'L3':[1630,1670,1700,],},},
               '魅族':{'X系':{'X1':[599,699,799,],'X2':[699,799,899,],'X3':[799,899,999,],},
                     'Y系':{'Y1':[1099,1199,1299,],'Y2':[1299,1399,1499,],'Y3':[1499,1599,1699,],},
                     'Z系':{'Z1':[2099,2199,2299,],'Z2':[2399,2499,2599,],'Z3':[2699,2799,2899,],},},}''')
    f.close()
with open('d:\\users\\three_menu.txt','r') as f:
    menus = eval(f.read())#把文件中的內容讀到內存中並轉化為內存中的數據類型
    print('歡迎來到購物商城!'.center(30,'*'))
    menu = []#聲明以空列表來存儲上一級菜單
    while True:
        dic = {}#聲明一個空字典,方便后續操作
        for index,good in enumerate(menus,1):#使用枚舉函數遍歷字典的鍵
            print(index,good)
            dic[index] = good#把序號作為字典的key,商品名稱作為字典的value傳入該字典中
        print('溫馨提示:\n1.選擇商品編號進入下一級菜單\n2.選擇B或者b返回上一級菜單\n3.選擇Q或者q退出商城')
        if type(menus) == list:#判斷要枚舉的菜單是否是列表類型
            choose = input('\033[31m請選擇你要購買的商品編號:\033[0m').strip()
            if choose.isdigit():#判斷輸入的是否是純數字
                if  int(choose) <= len(menus):
                    print('您選擇的%s已加入購物車!'% menus[int(choose)-1])
                    print('\033[31m最后一級菜單,只能返回和退出!\033[0m')
                else:
                    print('out range')
            else:
                if choose == 'q' or choose == 'Q':
                    print('已退出購物商城!')
                    break
                elif choose == 'b' or choose == 'B':
                    menus = menu[-1]#把菜單賦值給列表的最后一個元素
                    menu.pop()#刪掉列表的最后一個元素
                else:
                    print('error')
        else:
            choice = input('請選擇您要購買的商品編號進入下一級菜單:').strip()
            if choice.isdigit():
                if int(choice) in dic.keys():
                    menu.append(menus)#把菜單添加到列表中
                    menus = menus[dic[int(choice)]]#重新賦值菜單
                else:
                    print('range out')
            else:
                if choice == 'B' or choice == 'b':
                    print('由於當前處於首層菜單,因此本次返回將退出程序!')
                    if len(menu) < 1:break
                    menus = menu[-1]#把菜單賦值給列表的最后一個元素
                    menu.pop()#刪掉列表的最后一個元素
                elif choice == 'Q' or choice == 'q':
                    print('已退出購物商城!')
                    break
                else:
                    print('您的輸入有誤,請重新輸入!')

注:主要優化點為:

  1. 把菜單存儲到文件中
  2. 簡化代碼
  3. 棄用遞歸(遞歸效率偏低)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM