昨天我們在 Day13 學了更聰明的 for 迴圈,
像是 enumerate()
幫忙自動編號,zip()
幫忙一次處理多個列表,
還有 for-else
幫我們在「沒被 break 打斷」時做額外處理。
這些工具讓 for 迴圈變得更強大、更省力。
但是,人生不是每件事都能「事先規劃好次數」。
想像一下:
這些情境都無法事先知道要跑幾次迴圈,光靠 for
迴圈就會卡住。
這時候,就要請出 while 迴圈!(燒腦時間又到囉!)
首先我來用白話文解釋給讀者!由於我們有先教過for迴圈的概念了,
那今天同樣是屬於迴圈派的while-loop,所以我們必須要先來直接點出「差別」!
for 是「次數導向」,while 是「條件導向」
語法很簡單:
while 條件式:
要重複的程式碼
執行流程:
x = 0
while x < 3:
print("目前 x =", x)
x += 1
輸出:
x < 3
,就會一直跑count = 5
while count > 0:
print("倒數:", count)
count -= 1
print("時間到!")
輸出:
當 count
減到 0 時,條件 count > 0
不成立 → 直接結束
n = 10
while n < 5: # 這裡一開始就不成立
print("這行不會出現")
print("程式結束")
輸出:
類型 | for loop | while loop |
---|---|---|
適合情境 | 已知次數、要跑序列 | 不知道要跑幾次,依靠條件 |
控制方式 | 透過序列 or range() | 透過布林條件 (True/False) |
範例 | 跑 10 次印「Hi」 | 一直印「Hi」直到使用者輸入「q」 |
範例對比:
# for 版本:已知次數
for i in range(5):
print("第", i+1, "次 Hello")
輸出:
# while 版本:不確定次數,靠條件
command = ""
while command != "q":
command = input("輸入 q 離開: ")
print("你剛剛輸入:", command)
print("你已離開!")
輸出:
password = "1234"
user_input = ""
while user_input != password:
user_input = input("請輸入密碼: ")
print("登入成功!")
輸出:
import random
choices = ["剪刀", "石頭", "布"]
while True:
player = input("請輸入 剪刀/石頭/布 (輸入 q 離開): ")
if player == "q":
break
computer = random.choice(choices)
print("電腦出:", computer)
if player == computer:
print("平手!")
elif (player == "剪刀" and computer == "布") \
or (player == "石頭" and computer == "剪刀") \
or (player == "布" and computer == "石頭"):
print("你贏了 🎉")
else:
print("你輸了 QQ")
print("你已輸入q,遊戲結束!")
輸出:
tasks = ["吃飯", "寫作業", "運動", "追劇"]
while tasks: # 只要清單還有東西就繼續
print("剩下待辦事項:", tasks)
done = tasks.pop(0) # 移除最前面的
print("完成 ✅", done)
print("全部完成 🎉")
輸出:
這邊來多做補充:
while tasks:
的意思在 Python 裡,while
後面要放一個「條件」,只要這個條件判斷結果是 True,迴圈就會繼續跑。
那麼問題來了:
為什麼 tasks
這個 list 直接放在 while
後面,也能當成條件?
在 Python 裡,以下情況會被視為 False:
0
0.0
""
(空字串)[]
(空 list){}
(空字典)None
只要不是上面這些,其他東西都會被視為 True。
而這題的tasks
是一個 list。
tasks
就是 True → 迴圈繼續。tasks
就是 False → 迴圈結束。這邊做個小總結:
while tasks:
就好比在說:
「只要這份待辦清單還有東西,就繼續做事!」
當清單空了,才會停下來。
還記得我們之前有for-loop練習過ATM嗎?
今天我們要用while-loop來演練一下!!
而且相較於之前的練習,我們今天多了密碼驗證!
(這樣比較接近我們平常的ATM)
print("=============================")
print("公告:2025 IThome鐵人競賽第14天")
print("=============================")
balance = 10000 # 初始餘額
options = ["查詢餘額", "領錢", "存錢", "結束交易"]
correct_password = "1234" # 設定密碼
attempts = 0 # 嘗試次數
login_success = False # 布林變數控制是否進入 ATM
# 密碼驗證 (最多 3 次)
while attempts < 3:
pw = input("請輸入密碼: ")
if pw == correct_password:
print("✅ 密碼正確,歡迎使用 ATM!")
login_success = True
break
else:
attempts += 1
print(f"❌ 密碼錯誤,還有 {3 - attempts} 次機會")
else:
print("⚠️ 嘗試次數已達上限,ATM 鎖定")
# 只有密碼正確才進入 ATM 交易
if login_success:
t = 0 # 交易次數計數器
while t < 5:
print("\n請選擇服務:")
for i, opt in enumerate(options, 1):
print(f"{i}. {opt}")
choice = int(input("請輸入選項 (1-4): "))
if choice == 1: # 查詢餘額
print(f"💰 目前餘額:{balance} 元")
elif choice == 2: # 領錢
withdraw = int(input("請輸入提款金額:"))
if withdraw > balance:
print("⚠️ 餘額不足,交易取消")
continue
balance -= withdraw
print(f"✅ 成功領取 {withdraw} 元,目前餘額:{balance} 元")
elif choice == 3: # 存錢
deposit = int(input("請輸入存款金額:"))
balance += deposit
print(f"✅ 成功存入 {deposit} 元,目前餘額:{balance} 元")
elif choice == 4: # 結束交易
print("👋 感謝使用,本次交易結束!")
break
else:
print("⚠️ 無效的選項,請重新輸入")
t += 1
else:
print("⚠️ 已達交易上限 (5 次),系統自動結束!")
輸出:
這部分我想要補充一個點:
在這個 ATM 範例中,我們希望 只有在密碼正確的情況下才進入交易流程,如果密碼錯三次,就不能進入交易。
有幾種做法:
exit()
→ 直接強制結束程式(有點生硬)所以我們定義一個布林變數:
login_success = False # 初始設為 False
False
→ 密碼還沒正確,不允許交易True
→ 密碼正確,可以進入交易密碼驗證時改變布林值
while attempts < 3:
pw = input("請輸入密碼: ")
if pw == correct_password:
print("✅ 密碼正確,歡迎使用 ATM!")
login_success = True # ✅ 密碼正確,把布林值改為 True
break
else:
attempts += 1
print(f"❌ 密碼錯誤,還有 {3 - attempts} 次機會")
login_success = True
→ 表示「可以進入交易流程」False
利用布林值控制是否進入 ATM
if login_success:
# 進入 ATM 交易流程
else:
print("⚠️ 嘗試次數已達上限,ATM 鎖定")
if login_success:
只有當 login_success
是 True 時,才會執行 ATM 交易login_success
還是 False → else 區塊跑 → 提示 ATM 鎖定辛苦啦!!今天我們跟著 while 迴圈 玩了一整天,
重點都整理在這裡:
白話說,它就是「只要條件成立就一直做」的迴圈,好像你在說:
「只要你還沒完成作業,我就一直盯著你!」
條件成立 → 進入迴圈
條件不成立 → 跳出迴圈
一開始就不成立 → 迴圈一次都不會執行
for
:適合「我知道要跑幾次」或「要跑完整個序列」while
:適合「我不知道要跑幾次」,條件決定何時停break
→ 提前跳出迴圈continue
→ 跳過本次,繼續下一次while tasks:
只要 list 還有元素就繼續while + break + continue
處理使用者操作while 不只是「重複做事情」,它是一個能夠「動態判斷狀態」的強大迴圈。
搭配
break
、continue
、布林值,你就能設計出更智慧的互動流程,例如小遊戲、ATM 系統、待辦清單管理等等。
明天我們要開始玩 巢狀 while + for,讓迴圈可以互相配合,更複雜的場景也能搞定!
那我們就明天見囉!