Bài viết này hướng dẫn cách xây dựng một menu phân cấp ba cấp trong Python, tập trung vào việc tối ưu hóa mã nguồn và triển khai chức năng quay lui.
Tối ưu hóa cấu trúc dữ liệu cho menu
Mã nguồn cho các cấp độ khác nhau trong menu thường có cấu trúc lặp lại. Để giảm thiểu sự trùng lặp này, chúng ta có thể sử dụng một biến để theo dõi cấp độ hiện tại. Biến này sẽ lưu trữ một tham chiếu đến phần tử con tương ứng trong từ điển menu chính. Trong lần lặp đầu tiên, biến này sẽ trỏ đến toàn bộ từ điển `menu`. Khi người dùng chọn một tùy chọn, biến này sẽ được cập nhật để trỏ đến cấp độ tiếp theo.
current_layer = menu # Ban đầu trỏ đến toàn bộ menu
while True:
for key in current_layer:
print(key)
choice = input(">>> ").strip()
if not choice: # Bỏ qua nếu người dùng nhập trống
continue
Xử lý lựa chọn của người dùng
Sau khi nhận đầu vào từ người dùng, hệ thống sẽ kiểm tra xem lựa chọn đó có tồn tại trong cấp độ menu hiện tại hay không. Nếu có, biến `current_layer` sẽ được cập nhật để trỏ đến cấp độ con tương ứng, cho phép người dùng đi sâu vào menu.
if choice in current_layer:
current_layer = current_layer[choice] # Cập nhật để trỏ đến cấp độ con
else:
print('Lựa chọn không hợp lệ.')
Triển khai chức năng quay lui
Để cho phép người dùng quay lại cấp độ trước đó, chúng ta cần lưu trữ lịch sử các cấp độ đã đi qua. Một cách tiếp cận là sử dụng một danh sách để lưu trữ các cấp độ cha. Mỗi khi người dùng đi vào một cấp độ con, cấp độ cha hiện tại sẽ được thêm vào danh sách này. Khi người dùng chọn quay lui ('b'), hệ thống sẽ lấy cấp độ cha gần nhất từ danh sách và cập nhật `current_layer`.
Vấn đề nảy sinh khi chỉ lưu trữ một cấp độ cha duy nhất, vì nó sẽ bị ghi đè khi người dùng di chuyển sâu hơn vào menu. Để giải quyết điều này, chúng ta sử dụng một danh sách `parent_layers` để lưu trữ chuỗi các cấp độ cha.
parent_layers = [] # Danh sách lưu trữ các cấp độ cha
# ... trong vòng lặp ...
if choice in current_layer:
parent_layers.append(current_layer) # Lưu cấp độ hiện tại (cha của lựa chọn)
current_layer = current_layer[choice]
elif choice == 'b':
if parent_layers: # Chỉ quay lui nếu có cấp độ cha để quay về
current_layer = parent_layers.pop() # Lấy cấp độ cha cuối cùng từ danh sách
# ...
Mã nguồn hoàn chỉnh
Dưới đây là cấu trúc dữ liệu menu và mã Python đầy đủ để triển khai chức năng menu đa cấp với khả năng quay lui.
menu = {
'Beijing':{
'Chaoyang':{
'Guomao':{
'CICC':{},
'HP':{},
'Zadayinhang':{},
'CCTV':{},
},
'Wangjing':{
'Momo':{},
'Benz':{},
'360':{},
},
'Sanlitun':{
'Youyiku':{},
'apple':{},
},
},
'Changping':{
'Shahe':{
'Etiantian':{},
'Atai':{},
},
'Tiantongyan':{
'Lianjia':{},
'Woaiwojia':{},
},
'Huilongguan':{},
},
'Haidian':{
'Wudaokou':{
'Google':{},
'Wangyi':{},
'Shouhu':{},
'Sogu':{},
'Kuaishou':{},
},
"Zhongguancun":{
'Youku':{},
'Iqiyi':{},
'Qichezhijia':{},
'Xindongfang':{},
'qq':{},
}
},
},
'Shanghai':{
'Budong':{
'Lujia':{
'CICC':{},
'Gaosheng':{},
'Mogeng':{},
},
'Waitang':{},
},
'Minhang':{},
'Jingan':{},
},
'Shandong':{
'Jinan':{},
'Dezhou':{
'Leling':{
'Dingwuzhen':{},
'Chenqu':{},
},
'Pingyuan':{},
},
'Qindao':{},
},
}
current_layer = menu
parent_layers = []
while True:
for key in current_layer:
print(key)
choice = input(">>> ").strip()
if not choice:
continue
if choice in current_layer:
parent_layers.append(current_layer)
current_layer = current_layer[choice]
elif choice == 'b':
if parent_layers:
current_layer = parent_layers.pop()
else:
print('Lựa chọn không hợp lệ.')