如果你已經學過 dict 的基本操作——d[key] = value 存資料、for k, v in d.items() 走訪、in 判斷 key 存不存在——大概會有一個疑問:這些零散的操作要怎麼兜成一支「真正的程式」?
實務上答案很單純:套一個 while True 選單,把 dict 的增刪改查各包成一個選項,使用者輸入數字選功能,程式就一直跑到使用者選擇離開為止。這篇就帶你寫一支完整的「水果商品管理程式」,把 dict 的 CRUD(新增 Create、查詢 Read、修改 Update、刪除 Delete)全部串起來。
先看完整程式長什麼樣子
這支程式用一個 fruitPrices 字典存商品名稱和價格,選單有五個選項:
fruitPrices = {}
while True:
print('{:*^20}'.format('水果商品管理程式'))
print('{:^20}'.format('(1).新增產品'))
print('{:^20}'.format('(2).刪除產品'))
print('{:^20}'.format('(3).修改產品'))
print('{:^20}'.format('(4).目前產品'))
print('{:^20}'.format('(5).離開'))
choice = int(input('請輸入功能選項:'))
if choice == 5:
print('離開程式')
break
elif choice == 1: # 新增
item = input('請輸入新產品:')
if item in fruitPrices:
print('已有該商品!')
else:
price = input(f'請輸入 {item} 價格:')
fruitPrices[item] = price
print(f'產品 {item} 新增完成!')
elif choice == 2: # 刪除
item = input('請輸入刪除產品:')
if item not in fruitPrices:
print('無該商品')
else:
del fruitPrices[item]
print(f'產品 {item} 刪除完成!')
elif choice == 3: # 修改
item = input('請輸入修改產品:')
if item not in fruitPrices:
print('無該商品')
else:
fruitPrices[item] = input(f'請輸入 {item} 價格:')
print(f'產品 {item} 修改完成!')
elif choice == 4: # 目前產品
print('目前產品:')
for key, value in fruitPrices.items():
print(f'{key}={value}', end=' ')
print()先不急著逐行看,我們一段一段拆開講。
第一步:選單骨架,先把「離開」寫對
任何選單程式的骨架都長這樣:while True 讓程式不斷重複印選單、讀輸入,只有輸入符合離開條件時才 break 跳出迴圈。
fruitPrices = {}
while True:
print('{:*^20}'.format('水果商品管理程式'))
print('{:^20}'.format('(1).新增產品'))
print('{:^20}'.format('(2).刪除產品'))
print('{:^20}'.format('(3).修改產品'))
print('{:^20}'.format('(4).目前產品'))
print('{:^20}'.format('(5).離開'))
choice = int(input('請輸入功能選項:'))
if choice == 5:
print('離開程式')
break第二步:新增與刪除——in / not in 用法剛好相反
接下來把「新增」「刪除」接在 choice == 5 判斷式之後,用 elif 串起來:
elif choice == 1: # 新增
item = input('請輸入新產品:')
if item in fruitPrices:
print('已有該商品!')
else:
price = input(f'請輸入 {item} 價格:')
fruitPrices[item] = price
print(f'產品 {item} 新增完成!')
elif choice == 2: # 刪除
item = input('請輸入刪除產品:')
if item not in fruitPrices:
print('無該商品')
else:
del fruitPrices[item]
print(f'產品 {item} 刪除完成!')第三步:修改與查詢——一個是「有條件的賦值」,一個是走訪
elif choice == 3: # 修改
item = input('請輸入修改產品:')
if item not in fruitPrices:
print('無該商品')
else:
fruitPrices[item] = input(f'請輸入 {item} 價格:')
print(f'產品 {item} 修改完成!')
elif choice == 4: # 目前產品
print('目前產品:')
for key, value in fruitPrices.items():
print(f'{key}={value}', end=' ')
print()合併起來跑一次
把三段接在一起就是文章開頭那支完整程式。實際操作一輪:先新增蘋果 30 元、香蕉 20 元,再查看目前產品,最後離開:
******水果商品管理程式******
(1).新增產品
(2).刪除產品
(3).修改產品
(4).目前產品
(5).離開
請輸入功能選項:1
請輸入新產品:蘋果
請輸入 蘋果 價格:30
產品 蘋果 新增完成!
******水果商品管理程式******
(1).新增產品
(2).刪除產品
(3).修改產品
(4).目前產品
(5).離開
請輸入功能選項:1
請輸入新產品:香蕉
請輸入 香蕉 價格:20
產品 香蕉 新增完成!
******水果商品管理程式******
(1).新增產品
(2).刪除產品
(3).修改產品
(4).目前產品
(5).離開
請輸入功能選項:4
目前產品:
蘋果=30 香蕉=20
******水果商品管理程式******
(1).新增產品
(2).刪除產品
(3).修改產品
(4).目前產品
(5).離開
請輸入功能選項:5
離開程式商品順序照新增順序排列(蘋果先加,所以先印),這是 Python 3.7 之後 dict 保留插入順序的特性,不是巧合。
一個常見的坑:選單輸入打錯字會直接崩潰
試著在「請輸入功能選項:」故意打一個中文字或英文字看看,例如輸入 abc,你會看到程式直接丟出 ValueError: invalid literal for int() with base 10: 'abc' 然後整支程式當掉。
原因在這一行:
choice = int(input('請輸入功能選項:'))input() 拿到的永遠是字串,int() 硬把它轉成整數;只要字串裡不是純數字,int() 轉換失敗就會丟出 ValueError,而這支程式沒有做任何攔截,例外會一路往外拋,直接中止整個程式。
真正上線的程式通常會加一層 try/except 或先用 str.isdigit() 檢查再轉換,把這個崩潰點補起來。這篇先不處理,是刻意的——這篇的重點是把 dict 的 CRUD 邏輯講清楚,防呆是另一個獨立的主題,混在一起反而會讓兩件事都講不透徹。記得這是一個已知的簡化,之後要練防呆的時候再回來補這一行就好。
小結
整支程式其實就是一句話:dict 的 CRUD 操作,外面套一層 `while True` 選單。新增前用 in 擋重複、刪除和修改前用 not in 擋不存在,兩個方向剛好相反;del dict[key] 負責刪、直接賦值 dict[key] = 值 兼職新增和修改、.items() 負責走訪印出全部內容。這四個操作組合起來,幾乎就是任何一支「用字典存資料的小型管理程式」的骨架,換成學生成績、書籍庫存、會員資料,套路都一樣。
如果你還沒有練過 dict 的基本操作,可以先回頭複習變數、流程控制與資料型態,再回來對照這支程式會更清楚每一行在做什麼。