🚀 Day 1:打造第一個「終端機財務警示卡」
5 天全日營隊 (Day 1 / 總時數 6 Hours) | 從零建立程式認知與 TUI 介面
📖 為什麼學這些?——「終端機記帳小助手」關卡冒險故事線
假設你是一位剛開張的咖啡館老闆兼工程師,為了不讓店裡虧錢,你決定用 Python 寫出屬於你自己的第一套「記帳與財務警示系統」。今天六個小時的課程不是在死背語法,而是**一步步拼湊出你的第一個記帳產品**:
| 單元名稱 | 記帳程式關卡角色 | 為什麼這個單元不可或缺?(技術關聯) |
|---|---|---|
| 單元 1:Hello Python | 🏪 架設記帳櫃檯與招牌 | 沒有 print(),你的記帳系統就無法在螢幕上印出歡迎畫面與選單文字,就像開了一家沒有招牌的店。 |
| 單元 2:變數與資料型別 | 🏷️ 建立帳本欄位與價目表 | 記帳時需要紀錄文字(品項:"珍奶")與數字(金額:60)。變數是儲存盒,而「型別」確保電腦不會把品項跟價格搞混。 |
| 單元 3:input() 與轉型 | 🧮 打造點餐收銀輸入機 | 記帳本不能是死板的!透過 input() 讀取你今天花多少錢,並透過 int() 轉型,電腦才能替你做「預算扣除運算」。 |
| 單元 4:f-string 格式化 | 🧾 設計專業小費與收據樣板 | 印出亂糟糟的數字沒人想看。透過 f-string 加上千分位標點與 $ 符號,把數據渲染成漂亮的文字收據。 |
| 單元 5:專案:財務警示卡 | 💳 組裝第一代終端機 GUI 產品 | 結合前四個模組:接收金額 $\rightarrow$ 扣除預算 $\rightarrow$ 套用 ASCII 外框美化樣板,印出屬於你的專屬警示卡! |
| 單元 6:除錯大挑戰與驗收 | 🔍 擔任財務系統稽核員 | 當金額欄位輸入文字導致崩潰,或運算邏輯寫錯時,學習解讀紅字 Traceback,防止記帳系統算錯錢。 |
📌 課程前導與簡介說明
- 營隊定位:Day 1 核心任務是降解挫折感、建立操控程式的成就感,並在無形中植入 Web Template(模板渲染)的運作思維。
- 教學節奏:採「小步快跑」模式,每 20 分鐘觀念 + 25 分鐘實作 + 15 分鐘階段驗收。
- Django 銜接點:今日的核心銜接點為 Template 渲染機制。讓學生明白:
f"Hello {name}"在終端機印出動態文字的原理,與未來 Django 在 HTML 模板中使用{{ name }}完全同構。
歡迎來到 Day 1!今天你將化身為「文字 UI 設計師兼軟體工程師」。請閱讀每個單元的 **故事單元說明** 了解運作背後的理由,點擊內部的 **延伸閱讀** 按鈕展開觀念與 Google 搜尋連結;遇到錯誤時,可利用每個單元的 **AI 協作除錯提示詞** 協助解答!
💻 Day 1 專案總成果:個人專屬財務警示卡
【教師參考解答】學生於 Day 1 結束時將能獨立撰寫的完整程式:
"""
Day 1 最終成果:個人專屬財務警示卡與消費小費計算器
核心概念:Input 接收 -> 型別轉換與運算 -> f-string 動態 Template 渲染
"""
# --- 1. 資料收集 (模擬 HTTP POST 表單輸入) ---
print("==========================================")
print(" 🤖 歡迎使用 Python 個人財務小助手 🤖 ")
print("==========================================")
user_name = input("👉 請輸入你的名字: ")
daily_budget = int(input("👉 請輸入今日預算 (TWD): "))
expense_item = input("👉 請輸入今天最大的開銷品項: ")
expense_amount = int(input(f"👉 請輸入 [{expense_item}] 的金額 (TWD): "))
tip_rate = float(input("👉 請輸入服務費/小費比例 (例如 0.1 代表 10%): "))
# --- 2. 商業邏輯運算 (Business Logic) ---
tip_fee = expense_amount * tip_rate
total_expense = expense_amount + tip_fee
remaining_budget = daily_budget - total_expense
# --- 3. View 模板渲染 (動態帶入資料,對應 Django Template) ---
card_template = f"""
+--------------------------------------------------+
| 💳 個人財務警示卡 💳 |
+--------------------------------------------------+
持卡人姓名 : {user_name}
本日預算 : ${daily_budget:,.0f} 元
----------------------------------------------------
消費品項 : {expense_item}
原價金額 : ${expense_amount:,.0f} 元
服務費/小費 : ${tip_fee:,.0f} 元 ({tip_rate * 100:.0f}%)
總扣除金額 : ${total_expense:,.0f} 元
----------------------------------------------------
本日剩餘預算 : ${remaining_budget:,.0f} 元
+--------------------------------------------------+
"""
print("\n渲染財務卡片中...")
print(card_template)
# 邏輯判斷預告 (Day 3 銜接種子)
if remaining_budget < 0:
print("🚨 警告:您今日已經超支,請控制消費!")
else:
print("✅ 狀態良好:本日預算仍在安全範圍內。")
【學生自主實作框架】請根據今日各單元所學,將空缺的 `____` 填入正確程式碼:
"""
🎯 Day 1 自主挑戰:請將下方的 ____ 填入正確的變數或轉型函式!
"""
# --- 1. 資料收集 ---
print("==========================================")
print(" 🤖 歡迎使用 Python 個人財務小助手 🤖 ")
print("==========================================")
user_name = input("👉 請輸入你的名字: ")
# 提示:輸入的預算需要轉換成整數型別 (int)
daily_budget = ____(input("👉 請輸入今日預算 (TWD): "))
expense_item = input("👉 請輸入今天最大的開銷品項: ")
expense_amount = int(____("👉 請輸入金額 (TWD): "))
# --- 2. 運算邏輯 ---
remaining_budget = daily_budget - ____
# --- 3. f-string 樣板渲染 ---
# 提示:利用 {變數名稱} 將資料填入 ASCII 卡片中
card_template = f"""
+--------------------------------------------------+
| 💳 個人財務警示卡 💳 |
+--------------------------------------------------+
持卡人姓名 : {____}
本日預算 : ${daily_budget:,.0f} 元
今日開銷品項 : {expense_item}
本日剩餘預算 : ${____:,.0f} 元
+--------------------------------------------------+
"""
# 印出卡片
print(____)
⏰ 單元 1:環境建置與 Hello Python(09:00 - 10:00)
你正在開發「理財咖啡館」的第一台收銀終端機。print() 函式就像是櫃檯上面的「液晶顯示器」,沒有它,顧客與你都看不到歡迎文字與點餐選單!在這單元中,你會學到電腦是「從上到下」逐行執行程式指令的,而帶有 # 的註解則是寫給自己或團隊看的秘密備忘錄,電腦會自動跳過不執行。
在作業系統中,程式需要一個管道把資料傳遞給使用者,這個預設管道稱為 **標準輸出 (Standard Output / stdout)**。Python 的 print() 函式就是幫我們把記憶體裡的文字或數字傳送到 Terminal 螢幕上的介面。
- 換行符號
\n:代表 "Newline",能在單一字串中強制換到下一行。 end參數:print("Hi", end="")可以取消預設的自動換行行為。
🔗 Google 搜尋關鍵字 (依相關度排序,紫羅蘭標記為進階內容,點擊開啟新分頁):
🤖 AI 自主學習探索提示詞 (Prompt):
請向初學者詳細解釋 Python 的 print() 函式運作原理,並說明如何使用跳脫字元(如 \n, \t)以及 end 和 sep 參數來控制文字輸出的排版格式。
- VS Code Terminal 是與電腦對話的通道;
print()是發聲器。 - 點出指令由上而下執行的順序性。註解 `#` 的作用。
# 1-1: 第一行 Python 程式
print("Hello, Python!")
print("歡迎來到理財咖啡館!")
# 1-2: 多行輸出與跳脫字元 \n
print("品項:珍珠奶茶\n金額:60 元")
- 大小寫拼錯:寫成
Print("Hello")$\rightarrow$ Python 對大小寫極為敏感,Print非內建函式。 - 引號未成對:寫成
print("Hello)$\rightarrow$ 跳出SyntaxError: unterminated string literal。
我剛開始學 Python,在執行 print 程式碼時遇到了 SyntaxError: unterminated string literal 或 NameError: name 'Print' is not defined 錯誤。請協助我分析是哪一行拼錯或括號/引號沒關閉,並用高中生聽懂的語言引導我修復。
⏰ 單元 2:變數與資料型別(10:00 - 11:00)
記帳時,我們不能把所有的數字跟文字混成一團。變數(Variable)就像是「貼有標籤的收納盒」(用語法 = 指定將資料放進盒子裡)。這個單元會告訴你三大資料型別:文字名稱用字串(str,如 "珍珠奶茶")、整數金額用 int(如 60)、折扣比率用帶小數點的浮點數 float(如 0.9)。有了清楚的分類,系統才不會把品項名稱當成金額拿去加減乘除!
在 Python 中,變數等號 = 不是數學上的相等的概念,而是 **賦值/指定 (Assignment)**。Python 採用 **動態型別 (Dynamic Typing)**,意味著你不需要手動宣告變數類型,電腦會根據你塞入的資料自動判定型別。
str(String):文字資料,必須用單雙引號包裹,無法直接與數字做數學算術。int(Integer):精確的整數,適合計算金額與計數。float(Floating-Point):小數點數字,電腦採用浮點數標準處理。
🔗 Google 搜尋關鍵字 (依相關度排序,紫羅蘭標記為進階內容,點擊開啟新分頁):
🤖 AI 自主學習探索提示詞 (Prompt):
請向高中生解釋 Python 中的變數(Variable)與動態型別(Dynamic Typing)概念,並說明字串 (str)、整數 (int) 與浮點數 (float) 在記憶體處理與運算上的本質差異。
- 等號
=是「賦值(指定)」而非數學的等於。 - 說明三大基礎型別:字串
str、整數int、浮點數float。 - Django 銜接點:欄位型別(CharField, IntegerField)。
# 2-1: 宣告記帳欄位變數
item_name = "珍珠奶茶" # str (字串)
price = 60 # int (整數)
discount_rate = 0.9 # float (浮點數)
# 2-2: 檢查變數型別
print(type(item_name)) #
print(type(price)) #
# 2-3: 計算折價金額
final_price = price * discount_rate
print("折價後金額:", final_price)
- 變數未宣告即使用:寫成
print(total_cost)$\rightarrow$ 報錯NameError: name 'total_cost' is not defined。 - 字串與數字直接用 + 相加:
print("價格:" + 60)$\rightarrow$ 報錯TypeError: can only concatenate str (not "int") to str。
我在 Python 中寫了 print("價格:" + price) 時結果跳出 TypeError。請告訴我哪一個變數是字串、哪一個是整數,並教我如何透過型別轉換或 comma 串接來修復這個問題。
⏰ 單元 3:動態輸入 input() 與型別轉換(11:00 - 12:00)
寫死價格的程式太笨了!真正的記帳程式需要讓使用者手動輸入「今天花了多少錢」。input() 就像是收銀機的鍵盤按鈕,能隨時接收外部輸入。但請記住這個**黃金鐵律**:「鍵盤輸入進來的所有內容,預設一律都是『文字字串(str)』!」如果直接拿文字去扣預算,程式會出錯或算出誇張的字串重複結果。因此我們必須學會用 int() 或 float() 將文字強制轉型成數字,才能計算剩餘預算!
從作業系統的角度來看,使用者從鍵盤敲擊的字元(包含數字 0-9)都是字元流(Character Stream),因此 input() 統一處理為 str 型別。將其轉換為數字的過程被稱為 **顯式型別轉換 (Explicit Type Conversion / Casting)**。
- 字串乘法陷阱:
"50" * 2在 Python 會變成"5050"(重複次數),而非100。 - 安全轉型:使用
int("100")能將純數字字串轉換為可進行算術運算的數字型別。
🔗 Google 搜尋關鍵字 (依相關度排序,紫羅蘭標記為進階內容,點擊開啟新分頁):
🤖 AI 自主學習探索提示詞 (Prompt):
請詳細說明 Python input() 函式為什麼抓進來的資料預設永遠是字串 (str),以及什麼是『顯式型別轉換(Explicit Type Conversion)』?請舉例說明轉型在計算金額時的底層邏輯。
- 強調金句:「
input()抓進來的內容,預設一律都是文字字串(str)!」 - 若要算錢,必須使用
int()手動轉型(Casting)。 - Django 銜接點:表單 HTTP POST 輸入資料處理。
# 3-1: 正確的型別轉換 (Casting)
budget = int(input("👉 請輸入今日預算: "))
lunch_cost = int(input("👉 請輸入午餐費用: "))
# 進行數學計算
remaining = budget - lunch_cost
print("剩餘預算:", remaining)
- 字串拼接陷阱:未轉型直接相加
"100" + "50"變成"10050"而非 150。 - 轉型失敗:傳入非數字字串
int("百萬")$\rightarrow$ 跳出ValueError: invalid literal for int() with base 10: '百萬'。
我在執行 int(input()) 時,如果輸入英文或中文會跳出 ValueError 崩潰,或者沒轉型時金額相加變成字串串接 (10050)。請用初學者能懂的方式解釋原因,並示範如何正確進行 int() 轉型。
⏰ 單元 4:字串格式化 f-string(13:00 - 14:00)
印出 125000 這種光禿禿的數字看起來很不專業。在軟體開發中,我們希望把運算出來的數字,優雅地嵌進一段美麗的收據文字中。舊式的字串相加(+)既繁瑣又容易出錯,而現代 Python 的 f-string 語法(在字串前加 f 並用 {變數} 包裹)就像是「收據印表機樣板」。你甚至能一鍵加上千分位標點(:,)或控制小數點位數。這也是未來 Django 網頁將資料庫數據塞進 HTML 網頁模板的核心雛形!
Python 3.6 引入的 `f-string` (Formatted String Literals) 不僅提升了程式碼可讀性,更提供了強大的格式控制語法:
- 千分位分隔標點
:,:例如f"{1000000:,}"會自動格式化為1,000,000。 - 小數點精確度
:.2f:例如f"{3.14159:.2f}"會四捨五入輸出3.14。 - 欄位對齊與補零:
f"{5:>10}"(靠右對齊佔10格)、f"{5:0>3}"(補零為 005)。
🔗 Google 搜尋關鍵字 (依相關度排序,紫羅蘭標記為進階內容,點擊開啟新分頁):
🤖 AI 自主學習探索提示詞 (Prompt):
請向初學者詳細介紹 Python 3.6+ 的 f-string 語法,並示範如何用 :.2f 限制小數點、:, 顯示千分位標點,以及 :>10 進行欄位靠右對齊的語法細節。
- 展示 `f"字串 {變數}"` 語法的簡潔度。
- 高級排版:千分位 `:,` 與小數點 `:.2f`。
- Django 銜接點:`{}` 就是未來 Django Template 的 `{{ variable }}`。
price = 125000
tax_rate = 0.05
# 使用 f-string 進行千分位與小數點格式化
print(f"原價:${price:,.0f} 元")
print(f"含稅總價:${price * (1 + tax_rate):,.2f} 元")
- 漏寫開頭的 f:寫成
print("Hello {user}")$\rightarrow$ 變數不會被代換,直接印出文字Hello {user}。 - {} 內部引號衝突:寫成
f'User name is {'Alex'}'$\rightarrow$ 引號配對錯亂跳出SyntaxError。
我在寫 f-string 時螢幕直接印出了 {user} 變數名稱而沒有替換成實際資料,或是跳出了 SyntaxError 引號錯誤。請協助我檢查開頭的 f 字母以及 {} 內部的單雙引號配置。
⏰ 單元 5:專案實作:財務警示卡(14:00 - 15:00)
恭喜你!現在要把前四個單元的修練組合起來了!我們將實現一個完整的軟體流程:輸入資料(Input)$\rightarrow$ 計算扣除預算與小費(Logic)$\rightarrow$ 用 ASCII 字符(如 +, -, |)與 f-string 渲染出專屬的「財務警示卡」(View)。執行這個專案,感受一下你親手打造出來、帶有個人風格的文字使用者介面(TUI)吧!
在沒有圖形介面 (GUI) 的終端機環境中,工程師常透過 ASCII 符號組合繪製介面,稱為 **文字使用者介面 (TUI)**。搭配 Python 的三引號多行字串 """...""" 與 f-string,就能設計出模組化的卡片樣版。
- 多行字串
""":允許在字串中直接保留換行與空格排版。 - 組合架構:接收資料 (Input) $\rightarrow$ 商業運算 (Logic) $\rightarrow$ 樣板套用 (Template Render)。
🔗 Google 搜尋關鍵字 (依相關度排序,紫羅蘭標記為進階內容,點擊開啟新分頁):
🤖 AI 自主學習探索提示詞 (Prompt):
請向初學者解釋什麼是 TUI(文字使用者介面),以及如何結合多行字串(multiline string)與 f-string 設計出結構好看且整齊的終端機卡片樣版?
name = input("請輸入您的姓名: ")
salary = int(input("請輸入本月可支配預算: "))
food_cost = int(input("請輸入本週伙食預算: "))
balance = salary - food_cost
card = f"""
========================================
📊 {name} 的個人財務卡
========================================
總預算 : TWD ${salary:>8,d}
伙食預算 : TWD ${food_cost:>8,d}
----------------------------------------
剩餘可用 : TWD ${balance:>8,d}
========================================
"""
print(card)
- 全形與半形字對齊歪斜:中文(全形 2 位元)與英數(半形 1 位元)混用時,外框
|線對不齊。
我正在用 Python multiline f-string 印出 ASCII 文字外框卡片,但是因為裡面包含中文與數字,導致邊框 | 無法對齊。請幫我優化對齊與縮排語法,使其在終端機中保持美觀。
⏰ 單元 6:除錯大挑戰與驗收(15:00 - 16:00)
使用者往往不會按照你的預期操作程式!例如在金額欄位輸入中文「一百」,或者不小心拼錯變數名稱,都會導致程式瞬間閃退崩潰並印出滿螢幕的紅字(Traceback)。真正的工程師不怕紅字,因為紅字是 Python 給你的「除錯指南針」。在這個單元中,你將扮演系統稽核員,學會閱讀 Traceback 的最後一行(發生什麼錯、在哪一行),修復隱藏的 3 個 Bug,讓你的記帳程式堅不可摧!
當程式出錯時,Python 會印出堆疊追蹤訊息 (Traceback)。閱讀 Traceback 的關鍵是**「由下往上看」**:
- 看最後一行 (What):得知錯誤類型,例如
SyntaxError(語法錯)、TypeError(型別錯)、ValueError(轉型值錯)、NameError(變數名字拼錯)。 - 看倒數第二行 (Where):指出出錯的檔案與程式碼行號 (Line Number)。
- 對症下藥 (How):根據冒號後的詳細英文原因修正程式碼。
🔗 Google 搜尋關鍵字 (依相關度排序,紫羅蘭標記為進階內容,點擊開啟新分頁):
🤖 AI 自主學習探索提示詞 (Prompt):
請詳細拆解 Python Traceback 的結構,告訴我看懂紅字報錯的三大步驟,並用簡單的例子分析 SyntaxError、TypeError 與 ValueError 的根本差異。
print("=== 歡迎使用消費統計工具 ==="
item = input("請輸入品項:")
price = input("請輸入單價:")
count = int(input("請輸入數量:"))
total = price * count
Print(f"購買 {item} {count} 個,總共需要 {Total} 元")
- Line 1:
print(缺少閉合右括號)。 - Line 4:
price未使用int()轉型,導致算總價時變成「字串重複複製」。 - Line 9:
Print大寫錯誤(應為小寫print),且Total大寫與區域變數total不符。
嘗試執行上面的程式碼,閱讀 Terminal 顯示的 Traceback 紅字訊息!提示:注意括號是否有關閉、字串乘法與數字乘法的差異,以及 Python 對大小寫的嚴格要求!
- 盲目除錯:不讀 Traceback 直接問人 $\rightarrow$ 養成習慣先閱讀最後一行錯誤名稱。
請扮演一位嚴格但有耐心的 Python 程式導師。我現在提供一段報錯訊息(Traceback)給你,請『不要直接給我修復好的程式碼』,而是提示我該觀察哪一行、哪一個變數,引導我自己找出程式碼中的 3 個 Bug:\n\n[在此貼上你的報錯訊息]