iT邦幫忙

2025 iThome 鐵人賽

DAY 14
0

前言

昨天我們在 Day13 學了更聰明的 for 迴圈,
像是 enumerate() 幫忙自動編號,zip() 幫忙一次處理多個列表,
還有 for-else 幫我們在「沒被 break 打斷」時做額外處理。

這些工具讓 for 迴圈變得更強大、更省力。

但是,人生不是每件事都能「事先規劃好次數」。

想像一下:

  • 你要寫一個猜數字遊戲,要讓玩家一直猜,直到答對才結束。
  • 你去 ATM 領錢,操作完查詢餘額還想再提款,想存錢又想看交易紀錄,最後才按「結束交易」。
  • 你寫程式收集資料,使用者輸入多少你就收多少,直到輸入「0」才停止。

這些情境都無法事先知道要跑幾次迴圈,光靠 for 迴圈就會卡住。

這時候,就要請出 while 迴圈!(燒腦時間又到囉!)

一、while 迴圈是什麼?

首先我來用白話文解釋給讀者!由於我們有先教過for迴圈的概念了,
那今天同樣是屬於迴圈派的while-loop,所以我們必須要先來直接點出「差別」!

for 是「次數導向」,while 是「條件導向」

  • for:我已經知道要跑幾次,或是已經有一個範圍/序列。
  • while:我不知道要跑幾次,只知道「條件成立時就繼續跑」。

語法很簡單:

while 條件式:
    要重複的程式碼 

執行流程:

  1. 先檢查條件式是否成立(True/False)。
  2. True → 執行程式,再回去檢查。
  3. False → 跳出迴圈,繼續往下執行。

二、while 迴圈的三大情況

1.條件成立 → 執行迴圈

x = 0
while x < 3:
    print("目前 x =", x)
    x += 1

輸出:
https://ithelp.ithome.com.tw/upload/images/20250928/20164721CqPCErwKnb.png

  • 只要 x < 3,就會一直跑
  • 當 x 增加到 3,條件不成立 → 跳出迴圈

2.條件變成不成立 → 跳出迴圈

count = 5
while count > 0:
    print("倒數:", count)
    count -= 1
print("時間到!")

輸出:
https://ithelp.ithome.com.tw/upload/images/20250928/20164721ucv6ZYLeQo.png

count 減到 0 時,條件 count > 0 不成立 → 直接結束

3.條件「一開始」就不成立 → 迴圈一次都不執行

n = 10
while n < 5:  # 這裡一開始就不成立
    print("這行不會出現")
print("程式結束")

輸出:
https://ithelp.ithome.com.tw/upload/images/20250928/20164721YB3WMwmfpw.png

三、for 與 while 的比較

類型 for loop while loop
適合情境 已知次數、要跑序列 不知道要跑幾次,依靠條件
控制方式 透過序列 or range() 透過布林條件 (True/False)
範例 跑 10 次印「Hi」 一直印「Hi」直到使用者輸入「q」

範例對比:

# for 版本:已知次數
for i in range(5):
    print("第", i+1, "次 Hello")

輸出:

https://ithelp.ithome.com.tw/upload/images/20250928/20164721K2RJe6KVvx.png

# while 版本:不確定次數,靠條件
command = ""
while command != "q":
    command = input("輸入 q 離開: ")
    print("你剛剛輸入:", command)
print("你已離開!")

輸出:
https://ithelp.ithome.com.tw/upload/images/20250928/20164721vTpr5ZA5V1.png

四、牛刀小試(簡易版):

1.密碼驗證:

password = "1234"
user_input = ""

while user_input != password:
    user_input = input("請輸入密碼: ")
print("登入成功!")

輸出:
https://ithelp.ithome.com.tw/upload/images/20250928/20164721cGUJ6v6SUT.png

2.隨機數猜拳(結合 random)

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,遊戲結束!")

輸出:
https://ithelp.ithome.com.tw/upload/images/20250928/20164721iuomPHyXVw.png

3.任務清單(動態刪除元素)

tasks = ["吃飯", "寫作業", "運動", "追劇"]

while tasks:  # 只要清單還有東西就繼續
    print("剩下待辦事項:", tasks)
    done = tasks.pop(0)  # 移除最前面的
    print("完成 ✅", done)

print("全部完成 🎉")

輸出:
https://ithelp.ithome.com.tw/upload/images/20250928/20164721R6XnD6IuAG.png

這邊來多做補充:

while tasks: 的意思

在 Python 裡,while 後面要放一個「條件」,只要這個條件判斷結果是 True,迴圈就會繼續跑。

那麼問題來了:

為什麼 tasks 這個 list 直接放在 while 後面,也能當成條件?

Python 的判斷規則(真值判斷,Truthiness)

在 Python 裡,以下情況會被視為 False

  • 0
  • 0.0
  • ""(空字串)
  • [](空 list)
  • {}(空字典)
  • None

只要不是上面這些,其他東西都會被視為 True

而這題的tasks 是一個 list。

  • 當 list 裡面還有東西tasks 就是 True → 迴圈繼續。
  • 當 list 變成空的tasks 就是 False → 迴圈結束。

這邊做個小總結:

while tasks:

就好比在說:

「只要這份待辦清單還有東西,就繼續做事!」

當清單空了,才會停下來。

五、實戰演練:簡易ATM

還記得我們之前有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 次),系統自動結束!")

輸出:

1.假設密碼一直輸錯的話,輸錯三次就會鎖定。

https://ithelp.ithome.com.tw/upload/images/20250928/201647211waoKAy7OJ.png

2.正常操作,密碼驗證成功。

https://ithelp.ithome.com.tw/upload/images/20250928/20164721FDI9v0bPfR.png

這部分我想要補充一個點:

為什麼在密碼驗證要用布林值?

在這個 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 迴圈 玩了一整天,

重點都整理在這裡:

  1. while 是什麼?
    • 白話說,它就是「只要條件成立就一直做」的迴圈,好像你在說:

      「只要你還沒完成作業,我就一直盯著你!」

    • 條件成立 → 進入迴圈

    • 條件不成立 → 跳出迴圈

    • 一開始就不成立 → 迴圈一次都不會執行

  2. while vs for
    • for:適合「我知道要跑幾次」或「要跑完整個序列」
    • while:適合「我不知道要跑幾次」,條件決定何時停
  3. while 搭配 break / continue
    • break → 提前跳出迴圈
    • continue → 跳過本次,繼續下一次
    • 搭配條件判斷,控制流程更靈活
  4. 實戰演練收穫
    • 動態清單刪除while tasks: 只要 list 還有元素就繼續
    • ATM 提款系統:結合 while + break + continue 處理使用者操作
    • 密碼驗證:用布林值控制是否進入交易流程,限制三次輸入

while 不只是「重複做事情」,它是一個能夠「動態判斷狀態」的強大迴圈。

搭配 breakcontinue、布林值,你就能設計出更智慧的互動流程,例如小遊戲、ATM 系統、待辦清單管理等等。

明天我們要開始玩 巢狀 while + for,讓迴圈可以互相配合,更複雜的場景也能搞定!

那我們就明天見囉!


上一篇
【Day13】for 迴圈的隱藏技能包: zip、enumerate、for-else
下一篇
【Day15】while 進階攻略:無窮迴圈 × while-else 用法
系列文
Python 小白的逆襲:30 天從零到能教人的精華筆記,寫給迷惘的你與當年的我自己!16
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言