08 / 90

Day 08:迴圈、迴圈不變量與函式的輸入輸出

新內容:走訪文字的 for 迴圈、用來解釋迴圈為何正確的入門迴圈不變量,以及輸入與回傳值都明確的函式。每項活動都以第 04–07 天的簡短間隔複習(提取練習)開場,並記錄預測、觀察與復原證據;小修改保存在拋棄式 Git 儲存庫中。

自主學習與 Python 480 分鐘(8 小時專注學習)
01 120 分鐘

for 迴圈與入門迴圈不變量

代理協助練習:先寫下自己的預測和實際輸出,之後才可以請 AI 代理解釋或審閱,並且必須在證據中記錄所受的協助。

先決條件

已完成第 07 天(包括其獨立檢查)。復原:第 07 天(值與條件);第 07 天的迴圈預覽是選讀的背景知識。

學習目標

逐個碼位追蹤走訪字串的 for 迴圈,並陳述一個在迴圈前、每次迭代後和結束時都成立的迴圈不變量,包括空文字和 Unicode 文字的情況。

操作說明

學習來源:在本活動現有的閱讀與練習時段內,參考 Automate the Boring Stuff with Python, 3rd edition 的 Chapter 3; Practice Questions; Appendix B answers,用自己的話解釋一處與本地任務的聯繫。保留現有練習與驗收檢查;若外部資料無法存取,使用課程自寫的解釋。間隔複習暖身(10 分鐘): 憑記憶預測 bool("")、bool(" ") 和 "0" == 0,然後核對。有了昨天的複習,這應該很快;答得慢的地方就是需要回顧的地方。

新概念: for 迴圈對每個元素執行一次迴圈主體;對字串而言,每個元素是一個 Unicode 碼位。迴圈不變量是關於變數的一句話,它在第一次迭代前成立,並在每次迭代後保持成立。計數時的不變量是:total 等於已走訪字元中符合字元的個數。

1. 執行前,按 visited / total / 不變量是否成立 三欄填寫追蹤表。
2. 執行程式碼;它會印出同樣的欄位,方便你核對表格。
3. 執行第二段程式碼,觀察空文字的情況(迴圈主體執行零次)以及一個與碼位有關的意外結果。

text = "été"
target = "é"
total = 0
visited = ""
for ch in text:
    if ch == target:
        total += 1
    visited += ch
    print(repr(visited), total, total == visited.count(target))
print("final", total, visited == text)
text = ""
total = 0
for ch in text:
    total += 1
print("final", total)
print(len("é"), len("e\u0301"), "é" == "e\u0301")

練習與預測紀錄

執行前寫出 text = "été"、target = "é" 的完整追蹤表。接著陳述三個時刻的不變量:迴圈前(total = 0,尚未走訪任何字元)、每次迭代後、結束時(visited == text,所以 total 就是答案)。最後預測空字串的輸出以及 len("e\u0301")。

獨立掌握標準

追蹤表在執行前寫好且與實際各行一致;陳述了初始化、每次迭代後和結束時的不變量;正確預測了空文字情況和兩個碼位的分解形式情況。

來源資源與出處

linking Copyright Al Sweigart; edition-specific reuse terms unverified linking only; no reproduction

Automate the Boring Stuff with Python, 3rd edition

作者 / 機構: Al Sweigart | 原始出處連結 ↗

對應章節 / 時間戳: Chapter 3; Practice Questions; Appendix B answers

驗證版本與日期: Public edition checked 2026-11-01; moving pages may change

入選理由:

Beginner teaching and answer-keyed practice before checking exact semantics in the Python reference; selected chapters only, not the book's entire automation stack.

來源前置條件:

No prior programming required for Chapter 1; later chapters assume its basic Python concepts.

安全回退方案(離線彈性):

Use the original localized explanations, exercises and checks already present in this activity; no external account or purchase is required for that fallback.

對比候選資源與選型分析 (2)
The Python Tutorial ↗ compared_alternative [PSF License Version 2]

Guided Python syntax but assumes programming familiarity; paired with the beginner text rather than used as its replacement.

MIT OCW 6.0001 ↗ compared_alternative [CC BY-NC-SA 4.0]

Lectures and problem sets teach a broader CS1 course; the book offers shorter text-first entry and an answer appendix.

linking PSF License Version 2

The Python Tutorial: More Control Flow Tools

作者 / 機構: Python Software Foundation | 原始出處連結 ↗

對應章節 / 時間戳: 第 4.2–4.10 節(for、range、定義函式)

驗證版本與日期: Python 3.12 文件(核驗日期:2026-10-30)

入選理由:

用於查閱 Python 迭代、函式和容器的第一手參考資料。

來源前置條件:

第 01–06 天的 Python 運算式與檔案系統基礎

安全回退方案(離線彈性):

教材內已說明所有必需的行為,可以離線完成。

對比候選資源與選型分析 (2)
The Python Language Reference: Compound statements ↗ compared_alternative [PSF License Version 2]

在語法層面定義相同的結構;選擇教學章節是因為它循序漸進。

以講座節奏講解相同的控制流程;由於本課程已透過終端機練習推進這些概念,暫不採用。

02 120 分鐘

函式:明確的輸入、回傳值與契約

代理協助練習:先寫下自己的預測和實際輸出,之後才可以請 AI 代理解釋或審閱,並且必須在證據中記錄所受的協助。

先決條件

今天的活動 1。復原:計數不變量見活動 1;撰寫小型 def 見第 06 天活動 2。

學習目標

把計數迴圈包成函式,明確輸入(text、target)並回傳整數,寫下它的契約,並區分 return 與 print。

操作說明

學習來源:在本活動現有的閱讀與練習時段內,參考 Automate the Boring Stuff with Python, 3rd edition 的 Chapter 4; Practice Questions; Appendix B answers,用自己的話解釋一處與本地任務的聯繫。保留現有練習與驗收檢查;若外部資料無法存取,使用課程自寫的解釋。間隔複習暖身: 憑記憶寫出 a = [1]; b = a; a.append(2) 之後 b 的內容(第 05 天),然後核對。

新概念: 函式的契約說明它期望什麼輸入、回傳什麼、保證不改變什麼。count_char 接收 text(字串)和 target(恰好一個碼位),回傳 int,不修改輸入。return 把值交還給呼叫者;print 只是顯示文字,函式隨後回傳 None。

1. 預測 count_char 的全部七個輸出,然後執行。
2. 預測 shout 範例的兩行,然後執行。

def count_char(text, target):
    """Return how many code points in text are equal to target (one code point)."""
    total = 0
    for ch in text:
        if ch == target:
            total += 1
    return total
print(count_char("", "a"))
print(count_char("aaaa", "a"))
print(count_char("猫猫犬", "猫"))
print(count_char("café", "e"))
print(count_char("cafe\u0301", "e"))
original = "été"
print(count_char(original, "é"), original)
print(count_char("abc", "ab"))
def shout(text):
    print(text.upper())
result = shout("hi")
print(result)

練習與預測紀錄

記錄對七次 count_char 呼叫(空文字、重複字元、Unicode、預組合與分解形式的 "é"、保持不變的原字串、兩個字元的 target)以及 shout 範例的預測。然後用自己的話寫出 count_char 的契約:輸入、輸出以及它絕不改變的東西。

獨立掌握標準

九個預測都在執行前寫好並解釋了差異;你寫的契約包含兩個輸入、target 的前置條件、int 輸出和不修改的保證;能解釋 shout 的結果為什麼是 None。

來源資源與出處

linking Copyright Al Sweigart; edition-specific reuse terms unverified linking only; no reproduction

Automate the Boring Stuff with Python, 3rd edition

作者 / 機構: Al Sweigart | 原始出處連結 ↗

對應章節 / 時間戳: Chapter 4; Practice Questions; Appendix B answers

驗證版本與日期: Public edition checked 2026-11-01; moving pages may change

入選理由:

Beginner teaching and answer-keyed practice before checking exact semantics in the Python reference; selected chapters only, not the book's entire automation stack.

來源前置條件:

No prior programming required for Chapter 1; later chapters assume its basic Python concepts.

安全回退方案(離線彈性):

Use the original localized explanations, exercises and checks already present in this activity; no external account or purchase is required for that fallback.

對比候選資源與選型分析 (2)
The Python Tutorial ↗ compared_alternative [PSF License Version 2]

Guided Python syntax but assumes programming familiarity; paired with the beginner text rather than used as its replacement.

MIT OCW 6.0001 ↗ compared_alternative [CC BY-NC-SA 4.0]

Lectures and problem sets teach a broader CS1 course; the book offers shorter text-first entry and an answer appendix.

linking PSF License Version 2

The Python Tutorial: More Control Flow Tools

作者 / 機構: Python Software Foundation | 原始出處連結 ↗

對應章節 / 時間戳: 第 4.2–4.10 節(for、range、定義函式);資料結構見同一教學第 5 章

驗證版本與日期: Python 3.12 文件(核驗日期:2026-10-30)

入選理由:

用於查閱 Python 迭代、函式和容器的第一手參考資料。

來源前置條件:

第 01–06 天的 Python 運算式與檔案系統基礎

安全回退方案(離線彈性):

教材內已說明所有必需的行為,可以離線完成。

對比候選資源與選型分析 (2)
The Python Language Reference: Compound statements ↗ compared_alternative [PSF License Version 2]

在語法層面定義相同的結構;選擇教學章節是因為它循序漸進。

以講座節奏講解相同的控制流程;由於本課程已透過終端機練習推進這些概念,暫不採用。

03 120 分鐘

雙變數不變量,以及小提交與安全復原

代理協助練習:先寫下自己的預測和實際輸出,之後才可以請 AI 代理解釋或審閱,並且必須在證據中記錄所受的協助。

先決條件

今天的活動 1–2;已安裝 Git。復原:git diff 與 git restore 見第 07 天活動 3。

學習目標

用兩個迴圈變數並陳述不變量來實作 longest_run(text, target),然後在拋棄式儲存庫中記錄它,檢查一處不需要的未提交修改,並用 git restore 安全地捨棄。

操作說明

間隔複習: Git 部分用 Python 檔案重複第 07 天的復原流程,指令應該已經眼熟。

雙變數不變量: 每次迭代後,run 是以剛走訪的字元結尾的 target 連續段長度,best 是目前已走訪部分中最長的連續段。

1. 執行前預測四個輸出,並為 "aabaaa" 寫出追蹤表(ch / run / best)。

def longest_run(text, target):
    best = 0
    run = 0
    for ch in text:
        if ch == target:
            run += 1
        else:
            run = 0
        if run > best:
            best = run
    return best
print(longest_run("", "a"))
print(longest_run("baaab", "a"))
print(longest_run("aabaaa", "a"))
print(longest_run("猫猫犬猫", "猫"))

2. 在新的暫存目錄中提交該函式,加入一行不需要的除錯程式碼,檢查後復原。先預測每一項輸出:

cd "$(mktemp -d)"
git init -q
git config user.name "Learner"
git config user.email "[email protected]"
cat > stats.py <<'EOF'
def longest_run(text, target):
    best = 0
    run = 0
    for ch in text:
        if ch == target:
            run += 1
        else:
            run = 0
        if run > best:
            best = run
    return best
print(longest_run("猫猫犬猫", "猫"))
EOF
git add stats.py
git commit -q -m "Add longest_run"
python3 stats.py
printf 'print("debug", longest_run("", "a"))\n' >> stats.py
python3 stats.py
git diff --stat
git restore stats.py
git status --short
python3 stats.py
git log --format=%s

練習與預測紀錄

提交 longest_run("aabaaa", "a") 的追蹤表,四次呼叫(包括空字串和 "猫猫犬猫")的預測與觀察,以及 Git 紀錄:顯示除錯行出現、差異摘要,以及 git restore 之後狀態乾淨、輸出不變。

獨立掌握標準

追蹤表與參考各行一致;四次呼叫預測正確或已解釋不符;Git 紀錄與參考輸出一致,證明在不觸碰提交歷史的情況下去除了不需要的修改。

來源資源與出處

linking PSF License Version 2

The Python Tutorial: More Control Flow Tools

作者 / 機構: Python Software Foundation | 原始出處連結 ↗

對應章節 / 時間戳: 第 4.2–4.10 節(for、range、定義函式);資料結構見同一教學第 5 章

驗證版本與日期: Python 3.12 文件(核驗日期:2026-10-30)

入選理由:

用於查閱 Python 迭代、函式和容器的第一手參考資料。

來源前置條件:

第 01–06 天的 Python 運算式與檔案系統基礎

安全回退方案(離線彈性):

教材內已說明所有必需的行為,可以離線完成。

對比候選資源與選型分析 (2)
The Python Language Reference: Compound statements ↗ compared_alternative [PSF License Version 2]

在語法層面定義相同的結構;選擇教學章節是因為它循序漸進。

以講座節奏講解相同的控制流程;由於本課程已透過終端機練習推進這些概念,暫不採用。

04 120 分鐘

獨立檢查:預測迴圈並撰寫函式

獨立掌握檢查:提交證據之前不使用任何 AI 協助,也不查看參考答案;如實申報所受的協助。

先決條件

已完成今天的活動 1–3 並記錄證據。復原:活動 1(不變量)、活動 2(契約)、第 07 天(條件)。

學習目標

在無協助的情況下追蹤一個帶分支的迴圈,並實作 count_in(text, chars),陳述其不變量,以碼位為單位正確處理空、重複和 Unicode 文字。

操作說明

間隔複習: 迴圈中的分支沿用了第 06 天的條件。提交證據之前,不要打開參考答案,也不要使用 AI。

1. 預測這個迴圈印出的數字,然後執行。同時預測字串為空時的結果。

total = 0
for ch in "a猫a":
    if ch != "a":
        total += 10
    else:
        total += 1
print(total)

2. 實作 count_in(text, chars):回傳 text 中出現在 chars 裡的碼位個數(對單一字元 ch,運算式 ch in chars 在 ch 出現在 chars 中時為 True)。先用註解或一句話寫出不變量,再預測並測試:count_in("", "aeiou")、count_in("banana", "an")、count_in("naïve", "aeiouï")、count_in("cafe\u0301", "é")、count_in("猫と犬", "猫犬")。

練習與預測紀錄

提交:迴圈預測(非空與空兩種情況)、帶不變量的 count_in 程式碼、五個預測與五個實測結果,以及一句話解釋為什麼 count_in("cafe\u0301", "é") 為 0。

獨立掌握標準

無協助:迴圈預測(包括空的情況)正確;count_in 通過全部五個測試案例;不變量陳述正確;能在碼位層面解釋分解重音的情況。

來源資源與出處

linking PSF License Version 2

The Python Tutorial: More Control Flow Tools

作者 / 機構: Python Software Foundation | 原始出處連結 ↗

對應章節 / 時間戳: 第 4.2–4.10 節(for、range、定義函式)

驗證版本與日期: Python 3.12 文件(核驗日期:2026-10-30)

入選理由:

用於查閱 Python 迭代、函式和容器的第一手參考資料。

來源前置條件:

第 01–06 天的 Python 運算式與檔案系統基礎

安全回退方案(離線彈性):

教材內已說明所有必需的行為,可以離線完成。

對比候選資源與選型分析 (2)
The Python Language Reference: Compound statements ↗ compared_alternative [PSF License Version 2]

在語法層面定義相同的結構;選擇教學章節是因為它循序漸進。

以講座節奏講解相同的控制流程;由於本課程已透過終端機練習推進這些概念,暫不採用。