先決條件
已完成第 06 天(包括其獨立檢查)。如果卡住,先回到第 06 天;關於值與綁定,複習第 04–05 天。
學習目標
憑記憶回想 repr、type 和 bool 如何描述一個值,以及重新綁定與修改(變異)有何不同,然後用從未見過的輸入(包括空字串與 Unicode 文字)在 Python 中驗證。
操作說明
間隔複習: 第 04–05 天是兩三天前的內容,所以今天先提取、再重讀。先從記憶中把知識取出來再核對,比重讀筆記記得更牢。本活動沒有新內容。
1. 闔上筆記。對第一段程式碼中的每個值,寫下你預期的三欄:repr、型別名稱和 bool。也預測最後一行(len 計算的是 Unicode 碼位數,而不是位元組數)。 2. 執行程式碼,標出所有與預測不符的行。 3. 對綁定程式碼同樣先預測兩行,再執行。 4. 對每一處不符,用一句話寫出你忘記的規則,以及教授它的那一天(值見第 04 天,變異與同一性見第 05 天)。
def show(value):
print(repr(value), type(value).__name__, bool(value))
show(0.0)
show("0.0")
show("")
show("猫")
show([""])
show(None)
print(len("猫"), len("café"))
a = ["猫"]
b = a
a.append("犬")
print(b, a is b)
c = ["猫"]
d = c
c = c + ["犬"]
print(d, c is d)
練習與預測紀錄
製作預測表:每個值一行(0.0、"0.0"、""、"猫"、[""]、None),欄位為 repr / type / bool,並加上對 len("猫") 和 len("café") 的預測。接著預測綁定程式碼印出的兩行,並說明哪個名稱所指的物件被修改、哪個名稱被重新綁定。
查看提示
查看參考答案與追蹤
Mark as Completed
Save Progress
查看提示:
只有空字串為假;任何非空字串都為真,即使是 "0.0" 或一個空格。包含一個空字串的列表並不是空列表。append 修改的是兩個名稱共同指向的那個列表物件;c = c + [...] 會建立新列表,只移動名稱 c。
查看參考答案與追蹤:
第一段程式碼的確切輸出:
0.0 float False
'0.0' str True
'' str False
'猫' str True
[''] list True
None NoneType False
1 4
綁定程式碼的確切輸出:
['猫', '犬'] True
['猫'] False
原因:0.0 和 None 為假,"" 是空字串,所以為假;所有非空字串都為真,包括 "0.0"。[""] 是含一個元素的列表,所以為真。"猫" 是 1 個碼位,"café" 是 4 個。在綁定程式碼中,a 和 b 指向同一個列表,因此 append 的結果透過 b 也看得到,a is b 仍為 True。c + ["犬"] 建立了新列表,d 仍指向原本的 ["猫"],所以 c is d 為 False。
獨立掌握標準
預測在執行前寫好,涵蓋全部六個值、兩個 len 結果和綁定程式碼的兩行;每一處不符都有一句規則和一個復原日(第 04 天或第 05 天)。
來源資源與出處
對應章節 / 時間戳:
第 4.2–4.10 節(for、range、定義函式);資料結構見同一教學第 5 章
驗證版本與日期:
Python 3.12 文件(核驗日期:2026-10-30)
入選理由:
用於查閱 Python 迭代、函式和容器的第一手參考資料。
來源前置條件:
第 01–06 天的 Python 運算式與檔案系統基礎
安全回退方案(離線彈性):
教材內已說明所有必需的行為,可以離線完成。
對比候選資源與選型分析 (2)
在語法層面定義相同的結構;選擇教學章節是因為它循序漸進。
以講座節奏講解相同的控制流程;由於本課程已透過終端機練習推進這些概念,暫不採用。
先決條件
今天的活動 1。如果對比較感到陌生,複習第 05 天;條件與輸入正規化請複習第 06 天。
學習目標
回想 == 與 is 的差別,並憑記憶重寫一個第 06 天風格的分類函式,用明確條件處理空輸入、純空白輸入、十進位數字和 Unicode 數字。
操作說明
間隔複習: 本活動用新輸入複習第 05 天(比較)和第 06 天(條件),所以無法依賴記住的答案。
1. 預測比較這一行印出的五個布林值,然後執行。 2. 不看第 06 天,寫出 label(raw):先 strip;結果為空字串時回傳 "missing";strip 後的文字是十進位數字時回傳 "number " 加上整數值;否則回傳 "text " 加上 strip 後的文字。執行自己的版本之前先預測六行輸出。 3. 將你的函式與下面的參考實作比較,並執行兩者。
print(0 == 0.0, "0" == 0, None is None, [] == [], [] is [])
def label(raw):
text = raw.strip()
if text == "":
return "missing"
if text.isdecimal():
return "number " + str(int(text))
return "text " + text
print(label(" 猫 "))
print(label(""))
print(label(" "))
print(label("007"))
print(label("-3"))
print(label("٣"))
第 08 天預覽(不計評量,有鷹架): 執行下面的迴圈,只需觀察迴圈主體對每個字元執行一次。明天會正式學習迴圈。
for ch in "猫a":
print(ch, ch == "a")
練習與預測紀錄
寫下五個比較的預測和你自己的 label(raw),再預測 " 猫 "、""、" "、"007"、"-3" 和 "٣"(阿拉伯-印度數字 3)的六個輸出。執行後解釋 "٣" 出乎意料的結果。
查看提示
查看參考答案與追蹤
Mark as Completed
Save Progress
查看提示:
== 比較值;is 判斷兩個名稱是否指向同一個物件。每寫一次 [] 都會建立一個新列表。先 strip,再判斷是否為空字串:全是空格的字串 strip() 之後就變成空的。isdecimal() 不只對 0–9 為 True,對許多文字系統的十進位數字也為 True,int() 也接受它們。
查看參考答案與追蹤:
比較的輸出:
True False True True False
0 == 0.0 按數值比較(True);字串永遠不等於整數(False);None is None 是判斷 None 的安全寫法(True);兩個空列表相等(True),但它們是兩個不同的物件(False)。
label 的輸出:
text 猫
missing
missing
number 7
text -3
number 3
追蹤:" 猫 " strip 後是 "猫",不是十進位數字,所以得到 "text 猫"。"" 和 " " strip 後都是空字串,所以是 "missing"。"007" 是十進位數字,int("007") 為 7。"-3" 含有負號,isdecimal() 為 False,仍是文字。"٣" 是 Unicode 十進位數字,isdecimal() 為 True,int("٣") 為 3。預覽的輸出是 猫 False,接著是 a True。
獨立掌握標準
五個比較預測和六個 label 預測都在執行前寫好;你自己的 label(raw) 完全重現參考輸出;能解釋為什麼 " " 是 missing、為什麼 "٣" 是數字。
來源資源與出處
對應章節 / 時間戳:
第 4.2–4.10 節(for、range、定義函式);資料結構見同一教學第 5 章
驗證版本與日期:
Python 3.12 文件(核驗日期:2026-10-30)
入選理由:
用於查閱 Python 迭代、函式和容器的第一手參考資料。
來源前置條件:
第 01–06 天的 Python 運算式與檔案系統基礎
安全回退方案(離線彈性):
教材內已說明所有必需的行為,可以離線完成。
對比候選資源與選型分析 (2)
在語法層面定義相同的結構;選擇教學章節是因為它循序漸進。
以講座節奏講解相同的控制流程;由於本課程已透過終端機練習推進這些概念,暫不採用。
先決條件
今天的活動 1–2;已安裝 Git。如果對 git diff 或小提交感到陌生,複習第 04 天活動 3 和第 06 天活動 3。
學習目標
在拋棄式儲存庫中複習第 04–06 天的安全修改流程(diff、diff --check、小提交、log),並用一個有鷹架的新指令 git restore 捨棄未提交的修改,再驗證結果。
操作說明
間隔複習: 提交前檢查差異已在第 04 天和第 06 天練習過;今天在新的練習儲存庫中憑記憶重複一遍。今天的新內容(有鷹架): git restore FILE 預設從索引(暫存區)還原工作目錄中的已追蹤檔案;它不改變索引,也不取消暫存的修改。在本練習儲存庫中,索引與 HEAD(最新提交)相同,因此捨棄未暫存的修改後會還原為該已提交版本。它不能撤銷提交;那是第 09 天的內容。
只在新的暫存目錄中操作,絕不在課程儲存庫中操作。每個指令之前先寫下你預期的輸出(「沒有輸出」也算一種預測)。然後執行整個序列:
cd "$(mktemp -d)"
git init -q
git config user.name "Learner"
git config user.email "[email protected] "
printf 'label: 猫\n' > notes.txt
git add notes.txt
git commit -q -m "Add notes"
printf 'label: 猫\ncount: 1\n' > notes.txt
git diff --stat
git diff --check
git add notes.txt
git commit -q -m "Add count line"
git log --format=%s
printf 'oops\n' >> notes.txt
git status --short
git restore notes.txt
git status --short
cat notes.txt
練習與預測紀錄
先預測 git diff --stat、git diff --check、git log --format=%s 以及兩次 git status --short 的輸出,再執行序列並記錄實際輸出。最後寫出 git restore 之後的檔案內容,並解釋含 Unicode 的那一行 "label: 猫" 為什麼保留了下來。
查看提示
查看參考答案與追蹤
Mark as Completed
Save Progress
查看提示:
沒有空白錯誤時,git diff --check 什麼也不印。對未暫存的修改,git status --short 會印出 " M notes.txt"(開頭一個空格,接著是 M);工作目錄乾淨時輸出為空。git restore 只影響未提交的修改,所以兩次提交都留在 log 中。這裡絕不要使用 reset --hard、clean 或 force-push。
查看參考答案與追蹤:
整個序列的確切輸出:
notes.txt | 1 +
1 file changed, 1 insertion(+)
Add count line
Add notes
M notes.txt
label: 猫
count: 1
逐行說明:差異摘要顯示新增一行;git diff --check 沒有輸出(無空白錯誤);log 由新到舊列出兩次提交;追加 "oops" 後,簡短狀態為 " M notes.txt";git restore 從索引還原檔案,而本練習儲存庫中的索引仍與 HEAD 相同,因此未暫存的修改被捨棄,索引不變,第二次狀態沒有輸出,檔案重新只包含 "label: 猫" 和 "count: 1"。含 Unicode 的那一行之所以保留,是因為它屬於已提交的版本。
獨立掌握標準
執行前記錄了預測;實際輸出與參考輸出完全一致;能說明 git restore 適用的情況(已追蹤檔案上未提交的修改),並說明它不能撤銷提交。
來源資源與出處
對應章節 / 時間戳:
第 4.2–4.10 節(for、range、定義函式);資料結構見同一教學第 5 章
驗證版本與日期:
Python 3.12 文件(核驗日期:2026-10-30)
入選理由:
用於查閱 Python 迭代、函式和容器的第一手參考資料。
來源前置條件:
第 01–06 天的 Python 運算式與檔案系統基礎
安全回退方案(離線彈性):
教材內已說明所有必需的行為,可以離線完成。
對比候選資源與選型分析 (2)
在語法層面定義相同的結構;選擇教學章節是因為它循序漸進。
以講座節奏講解相同的控制流程;由於本課程已透過終端機練習推進這些概念,暫不採用。
先決條件
已完成今天的活動 1–3 並記錄證據。復原連結:第 04 天(值)、第 05 天(綁定與比較)、第 06 天(條件與安全 Git)。
學習目標
在無協助的情況下預測值、綁定和比較的結果,從零實作一個使用明確條件的小函式,並憑記憶寫出安全檢查指令。
操作說明
間隔複習: 這是第 04–06 天的每週鞏固檢查。提交證據之前,不要打開參考答案,也不要使用 AI。
1. 先書面預測這段程式碼印出的三行,再執行:
print(repr("0"), bool("0"), "0" == 0)
x = ["a"]
y = x
x.append("é")
print(y)
x = ["a"]
y = x
x = x + ["é"]
print(y)
2. 從零寫出 describe(raw):strip 後為空時回傳 "empty",是十進位數字時回傳 "digits",否則回傳 "text"。先預測,再用 ""、" "、"42"、"42"(全形數字)和 "猫" 測試。 3. 憑記憶列出:在拋棄式儲存庫中提交前檢查修改要執行的指令,以及捨棄已追蹤檔案上未提交修改的指令。
練習與預測紀錄
提交:三行程式碼的預測和實際輸出;describe(raw) 的程式碼及五個預測、五個實測結果;安全檢查與復原的指令清單;如有不符,寫出你要回顧的復原日。
查看提示
查看參考答案與追蹤
Mark as Completed
Save Progress
查看提示:
請在認真嘗試之後再看:把失敗的情況縮減為一個輸入,比較預測與實際輸出,指出涉及的規則(空字串、strip、isdecimal、修改與重新綁定)。
查看參考答案與追蹤:
程式碼輸出:
'0' True False
['a', 'é']
['a']
describe(raw) 的參考實作及其輸出:
def describe(raw):
text = raw.strip()
if text == "":
return "empty"
if text.isdecimal():
return "digits"
return "text"
print(describe(""))
print(describe(" "))
print(describe("42"))
print(describe("42"))
print(describe("猫"))
empty
empty
digits
digits
text
" " strip 後是空字串,所以是 empty。全形 "42" 由 Unicode 十進位數字組成,所以是 digits。安全檢查:執行 git status --short、git diff、git diff --check,理解差異後再執行 git add FILE 和 git commit;用 git restore FILE 捨棄未提交的修改,並確認 git status --short 沒有輸出。
獨立掌握標準
無協助:三行預測先寫好;describe(raw) 通過全部五個測試案例(包括空、純空白和全形 Unicode 數字);指令清單正確;每一處不符都寫明復原日。
來源資源與出處
對應章節 / 時間戳:
第 4.2–4.10 節(for、range、定義函式);資料結構見同一教學第 5 章
驗證版本與日期:
Python 3.12 文件(核驗日期:2026-10-30)
入選理由:
用於查閱 Python 迭代、函式和容器的第一手參考資料。
來源前置條件:
第 01–06 天的 Python 運算式與檔案系統基礎
安全回退方案(離線彈性):
教材內已說明所有必需的行為,可以離線完成。
對比候選資源與選型分析 (2)
在語法層面定義相同的結構;選擇教學章節是因為它循序漸進。
以講座節奏講解相同的控制流程;由於本課程已透過終端機練習推進這些概念,暫不採用。