Python

你已經會用工具,現在要讀懂地圖:Python 語言核心五件事

Python 語言核心其實只有五件事:變數與型別、字串操作、條件判斷、迴圈、函式。你不需要背語法,只要看到這些結構時知道它在做什麼,就能讀懂 AI 產出的程式碼,也能抓出型別搞混這種 AI 最常犯的錯誤。
你已經會用工具,現在要讀懂地圖:Python 語言核心五件事

你已經會用工具,現在要讀懂地圖:Python 語言核心五件事

上一課你學會了怎麼跟 AI 要程式、怎麼設定環境、怎麼避開幾個常見的安全陷阱。這一課要進入語言本身:變數、字串、條件判斷、迴圈、函式,這五件事幾乎撐起了 AI 幫你寫的每一段 Python 程式碼。

你不需要把語法全部背起來,你需要的是看到這些結構時,知道它在做什麼。看得懂,你才能精準下指令、才能一眼抓出 AI 常犯的型別錯誤、才能自己動手改而不是整段重寫。

你將學到什麼

變數與資料型別

str、int、float、bool 四種基本型別,以及 input() 永遠回傳字串的轉型陷阱。

字串操作

strip、split、join、f-string 常用方法,以及索引從 0 開始的切片規則。

條件判斷

if / elif / else 怎麼分工,跟寫成多個獨立 if 差在哪裡。

迴圈 for / while

什麼時候用 for、什麼時候用 while,以及無限迴圈是怎麼發生的。

函式設計

名字、參數、return 三件事,讀懂任何一個函式在吃什麼、吐什麼。

AI 常見型別陷阱

字串加數字、None 做運算、10 / 2 不是整數,四個最常見的地雷。

🗣️ 本模組三問口訣每看到一段新程式碼,問自己三個問題:
① 這個變數裝的是什麼型別?(字串、數字、還是串列?)
② 這個條件或迴圈的邏輯是什麼?(什麼情況走哪條路?)
③ 這個函式的輸入和輸出是什麼?(吃什麼、吐什麼?)
變數與型別字串操作條件判斷迴圈 for 與 while函式設計看懂 AI 寫的程式碼
Python 語言核心五件事,依序打好基礎:變數與型別、字串操作、條件判斷、迴圈、函式設計,最終目標是看懂 AI 寫的程式碼。

2-1 變數與資料型別

變數是程式的「命名魔法盒」:你給一個盒子取名字,把值放進去,之後隨時叫名字就能拿到值。Python 的變數不需要事先宣告型別,而AI 產出的程式碼幾乎每一行都在用變數,這是讀懂程式的第一步。

name = "Joan"         # 字串 str
age = 28              # 整數 int
height = 165.5        # 浮點數 float
is_student = True     # 布林值 bool

print(type(name))     # <class 'str'>
print(type(age))      # <class 'int'>
型別名稱範例值常見用途
str字串"Hello"'Joan'姓名、訊息、API 回應
int整數42-70計數、索引、年齡
float浮點數3.1499.9價格、比率、座標
bool布林值TrueFalse開關、條件判斷結果
💡 Vibe Coder 觀察重點看到 AI 寫 type(x),它在確認型別。看到 int(x)str(x),它在做型別轉換。這兩個動作在 AI 產出的程式碼裡非常頻繁。

型別轉換:AI 最常幫你做、也最常犯錯的事

Python 不會自動幫你轉型別,你必須明確告訴它。AI 有時候會忘記轉換,導致程式在你實際執行時崩潰。

❌ 危險寫法:字串和數字直接相加input() 永遠回傳字串,直接拿去跟數字相加會丟出 TypeError
age = input("請輸入年齡:")   # input() 永遠回傳字串!
result = age + 10             # TypeError:str + int 不合法
✅ 正確寫法:明確轉換型別收到輸入之後,先用 int() 轉成整數,再拿去運算。
age = int(input("請輸入年齡:"))  # 先轉成整數再運算
result = age + 10                 # 正確:28 + 10 = 38
函式作用注意事項
int(x)轉成整數小數點會被截掉;"abc" 會報錯
float(x)轉成浮點數"3.14" 可以轉;"abc" 會報錯
str(x)轉成字串幾乎任何值都能轉,不會報錯
bool(x)轉成布林值0""NoneFalse,其他都是 True

2-2 字串操作

字串是 AI 產出程式裡出現最頻繁的型別,處理使用者輸入、API 回應、資料清洗,幾乎都在操作字串。你不需要背全部方法,要記住的是:看到 . 後面接文字就是字串方法

text = "  Hello, Vibe Coder!  "

text.strip()          # 去頭尾空白,變成 "Hello, Vibe Coder!"
text.lower()          # 全小寫
text.upper()          # 全大寫
text.replace("Hello", "Hi")  # 替換
text.split(",")       # 切割成串列
",".join(["a", "b", "c"])  # 合併,結果是 "a,b,c"

# f-string:最常用的字串格式化
name = "Joan"
score = 98
print(f"{name} 的分數是 {score} 分")

索引與切片:取出字串的一部分

text = "Python"   # 索引 0=P 1=y 2=t 3=h 4=o 5=n

text[0]       # "P"(第一個)
text[-1]      # "n"(最後一個)
text[0:3]     # "Pyt"(0 到 2,不含 3)
text[::-1]    # "nohtyP"(反轉)

# 實際應用:取 email @ 前面的帳號
email = "joan@example.com"
account = email.split("@")[0]   # "joan"
⚠️ Vibe Coder 易犯錯誤:索引從 0 開始第一個字元是 [0],不是 [1]。範圍切片 [0:3] 取的是第 0、1、2 個,不含第 3 個。AI 和人類都會犯這個錯。

2-3 條件判斷 if / elif / else

條件判斷讓程式根據不同情況走不同的路。你只要能讀懂「這個條件成立時做什麼、不成立時做什麼」,就已經掌握了它。

score = 85

if score >= 90:
    print("優秀")
elif score >= 70:
    print("良好")      # 85 落在這裡
elif score >= 60:
    print("及格")
else:
    print("不及格")
❌ 危險:= 和 == 混淆,以及縮排錯誤if name = "Joan":SyntaxError,條件要用 ==if 底下的內容忘記縮排會是 IndentationError
💡 Vibe Coder 觀察重點
  • ==(兩個等號)才是比較;=(一個等號)是指定
  • if 後面的程式碼必須縮排四個空格
  • 多個獨立 ifif / elif 是完全不同的邏輯:elif 是互斥條件,只會走其中一條路
運算子意義運算子意義
==等於!=不等於
a > b大於a >= b大於等於
a < b小於a <= b小於等於
and且(兩個都成立)or或(一個成立即可)

2-4 迴圈 for / while

迴圈讓程式重複執行同樣的事。AI 在處理清單、批次 API 呼叫、資料處理時大量使用迴圈。你需要能讀懂「它在跑幾次」和「每次在做什麼」。

for 迴圈:對串列每個元素做同一件事

fruits = ["蘋果", "香蕉", "草莓"]

for fruit in fruits:
    print(f"我喜歡 {fruit}")   # 跑 3 次

# range() 跑固定次數
for i in range(3):            # i = 0, 1, 2
    print(f"第 {i+1} 次")

# enumerate() 同時取索引和值
for i, fruit in enumerate(fruits):
    print(f"{i}: {fruit}")     # 0:蘋果,1:香蕉,2:草莓

while 迴圈:條件成立就一直跑

# while True + break:等待有效輸入
while True:
    answer = input("輸入 yes 或 no:")
    if answer in ["yes", "no"]:
        break
    print("請只輸入 yes 或 no")
⚠️ Vibe Coder 易犯錯誤:無限迴圈while 迴圈忘記更新條件,或沒有 break,程式會永遠跑下去。看到 while 迴圈,確認條件變數有被更新,或有 break 能跳出。
💡 for vs while 選擇原則清單逐項處理用 for;跑固定次數用 for 搭配 range;次數未知、等待條件用 while;等待有效輸入用 while True 搭配 break

2-5 函式設計

函式是「把一段有名字的程式碼打包起來,之後呼叫名字就執行」。你要能讀懂:函式叫什麼名字、接受什麼輸入(參數)、回傳什麼輸出(return

def greet(name, greeting="你好"):   # greeting 有預設值
    """向指定名稱打招呼,回傳問候字串。"""
    message = f"{greeting},{name}!"
    return message

result = greet("Joan")           # "你好,Joan!"
result2 = greet("Ann", "嗨")     # "嗨,Ann!"
❌ 危險:忘記 return,以為有值函式算完卻沒有 return,呼叫端拿到的是 None,不會馬上報錯,直到下一步運算才會爆出 TypeError
def add(a, b):
    result = a + b   # 計算了但沒有 return!

total = add(3, 5)
print(total)         # None(不是 8)
💡 Vibe Coder 觀察重點:三個問題讀懂任何函式
  • 名字def 後面的名稱,說明函式在做什麼事
  • 參數:括號裡的變數,是你需要提供的輸入
  • return:函式執行完後給你的輸出,沒有 return 就是 None
💡 給 AI 要函式的標準提示詞「請寫一個 Python 函式,名稱 calculate_bmi,輸入體重(kg,float)和身高(m,float),計算並回傳 BMI(float,保留兩位小數)。加上 docstring、型別註解,以及身高體重小於等於 0 時拋出 ValueError 的驗證。」

2-6 型別陷阱與 AI 常見錯誤

型別錯誤是 Vibe Coder 最常遇到的 Bug,九成都是 AI 沒注意型別轉換。這四種陷阱認識了,你就能在程式崩潰前先看出問題。

陷阱一:字串和數字混用

❌ str 加 int 不合法"年齡是 " + age 會丟出 TypeError,字串不能直接加整數。
age = 28
print("年齡是 " + age)    # TypeError
✅ 用 f-string 或先轉型f-string 讓 Python 自動處理,或者先用 str() 轉成字串再拼接。
print(f"年齡是 {age}")        # f-string 自動處理
print("年齡是 " + str(age))   # 先轉成字串

陷阱二:None 型別操作

❌ 對 None 做運算函式忘記 return 就會回傳 None,之後拿去運算會丟出 TypeError:NoneType + int
def add(a, b):
    result = a + b      # 沒有 return!
total = add(3, 5)
print(total + 1)        # TypeError:NoneType + int

陷阱三:比較時型別不一致

❌ 字串和數字比較input() 回傳的是字串,直接拿去跟數字比較會出錯。
score = input("輸入分數:")   # 回傳字串 "85"
if score >= 60:               # TypeError
✅ 比較前先轉型先用 int() 轉成整數,再進行比較。
score = int(input("輸入分數:"))   # 先轉成整數
if score >= 60:                   # 整數比整數,正確

陷阱四:/ 的結果永遠是浮點數

❌ 以為 10 / 2 是整數 5Python 的 / 一律回傳浮點數,就算除得盡也一樣。
result = 10 / 2    # 結果是 5.0(float),不是 5(int)
✅ 需要整數時用 //整數除法用 //,取餘數用 %
result = 10 // 2   # 整數除法,結果是 5(int)
remain = 10 % 3    # 餘數,結果是 1
💡 型別錯誤三步偵錯法① 看 TypeError 訊息中的型別衝突。② 跳到錯誤行號。③ 請 AI 加 print(type(x)) 確認實際型別。

三道遞進題:讀懂、改寫、抓錯

💡 為什麼 Vibe Coder 要做這三道題?
  • 讀懂:變數、型別、迴圈、函式同時出現時,你要能逐行拆解
  • 改寫:AI 給了可以跑的程式,但你要讓它更安全、更清晰
  • 抓錯:型別陷阱和邏輯錯誤是 AI 最常犯的,你必須看得出來

題目一:讀懂(基礎)

任務:逐行說明以下程式碼在做什麼,包括函式的輸入和輸出、迴圈在做什麼,以及 :.1f 的作用。

def calculate_average(numbers):
    total = 0
    for num in numbers:
        total += num
    return total / len(numbers)

scores = [85, 92, 78, 96, 88]
result = calculate_average(scores)
print(f"平均分數:{result:.1f}")
  1. def calculate_average(numbers): 定義函式,輸入是數字串列 numbers,輸出是平均值(浮點數)。
  2. total = 0,再用 for num in numbers:total += num 把串列所有數字加總,+= 是「在原有值上加」的縮寫。
  3. return total / len(numbers):總和除以元素個數,len() 取得串列長度,回傳平均值。
  4. f"平均分數:{result:.1f}":其中 .1f 是格式化指令(保留一位小數),結果輸出「平均分數:87.8」。

題目二:改寫(進階)

💡 為什麼 Vibe Coder 需要懂輸入驗證?AI 給你的函式通常假設輸入是「正常的」,但真實使用者什麼都會輸入。空串列、None、字串混入數字,都會讓程式在最不想要的時候崩潰。主動要求 AI 加驗證,是讓程式從「能跑」變成「可靠」的關鍵。

任務:上面的 calculate_average 函式,如果傳入空串列會除以零崩潰,如果混入字串會報 TypeError。請 AI 用以下提示詞修正:

「請改進 calculate_average 函式,加上以下驗證:
1. 傳入的不是串列,拋出 TypeError 並說明原因
2. 串列是空的,拋出 ValueError 並說明原因
3. 串列裡有非數字的元素,跳過它並印出警告
請加上 docstring 說明參數型別和可能的例外。每行加中文註解。」
  1. 型別檢查if not isinstance(numbers, list):raise TypeError(...),用 isinstance() 確認傳入的是串列型別。
  2. 空串列檢查if len(numbers) == 0:raise ValueError(...),避免除以零錯誤。
  3. 非數字過濾:迴圈內加 if not isinstance(num, (int, float)):print(警告);continue,跳過非數字值繼續執行。
💡 Vibe Coder 觀察重點收到 AI 修改後的版本,確認三件事:① 有沒有 isinstance 做型別檢查。② 空串列有沒有被處理。③ 非數字元素是跳過還是中止程式。這三個判斷的差異會直接影響使用者體驗。

題目三:抓錯(高階)

💡 為什麼 Vibe Coder 需要識別邏輯錯誤?型別錯誤會讓程式崩潰,容易發現。但邏輯錯誤不會崩潰,程式安靜跑完,給你一個錯誤的答案。這種 Bug 最危險,因為你不知道它出了問題。AI 也常犯邏輯錯誤。

任務:找出以下程式碼至少兩個問題,說明危險原因,並寫出你會如何請 AI 修正。

def classify_score(score):
    if score >= 60:
        grade = "及格"
    if score >= 70:
        grade = "良好"
    if score >= 90:
        grade = "優秀"
    return grade

print(classify_score(95))   # 看起來正常?
print(classify_score(50))   # 這行會怎樣?
問題一:用 if 而非 elif,條件覆蓋三個獨立 if 都會被判斷。輸入 95 時三個都成立,grade 被蓋三次,最終是「優秀」,看起來正確;但輸入 75 時,第一個和第二個條件都成立,最終是「良好」而非「及格」。邏輯上應該用 if / elif / elif / else 確保互斥。
問題二:score 小於 60 時 grade 未定義輸入 50 時,三個 if 都不成立,grade 從未被指定,return grade 拋出 UnboundLocalError。需要加 else:grade = "不及格" 處理這種情況。
💡 給 AI 的修正提示詞「這個函式有兩個問題:① 應該用 if / elif / elif / else 而非多個獨立 if,避免條件覆蓋。② 沒有處理 score 小於 60 的情況,會造成 UnboundLocalError。請修正並加上 score 範圍驗證(0 到 100),超出範圍拋出 ValueError。」

術語速查表

術語說明
type(x)回傳變數 x 的型別,例如 type(28) 回傳 int
int(x)str(x)float(x)型別轉換函式。
input()讀取使用者輸入,永遠回傳字串,需要時必須手動轉型。
索引(Index)字串或串列中的位置編號,從 0 開始計算。
切片(Slice)[start:end] 取出一段,不含 end 位置的元素。
.strip().split().join()去空白、切割成串列、合併串列成字串。
f-string字串前加 f,大括號內放變數,格式化如 .1f(一位小數)。
if / elif / else互斥條件判斷;多個獨立 if 不互斥。
for … in …對串列每個元素執行一次,次數由串列長度決定。
range(n)產生 0 到 n 減 1 的整數序列,與 for 搭配跑固定次數。
while / break條件成立就持續執行;break 跳出迴圈。
def / return定義函式;return 回傳結果,沒有則回傳 None
isinstance(x, type)安全型別判斷,比 type(x) == type 更推薦。
UnboundLocalError使用未指定值的變數,常見於 if 沒涵蓋所有情況。

重點整理與完成清單

概念說明記憶方式
str / int / float / bool四種基本型別文字、整數、小數、開關
input() 永遠是字串需要用 int()「進來都是文字」
索引從 0 開始第一個是 [0]電梯從 0 樓
if vs elif互斥用 elif,各自判斷用 if只走一條路才用 elif
for vs while知道次數用 for,未知用 while清單 for,等待 while
return沒有 return 就是回傳 None函式要「給」才用 return
🗣️ Vibe Coder 三問口訣這行做什麼?為什麼這樣寫?有沒有型別或邏輯問題?
每次看到 AI 的程式碼,問這三個問題,你就不會只是複製貼上。

模組二完成清單

  • 能說出四種基本型別各自的用途和範例值
  • 知道 input() 回傳字串,需要手動轉型
  • 能用索引和切片取出字串的特定部分
  • 能分辨 if / elif / else 和多個獨立 if 的差異
  • 能判斷什麼情況用 for、什麼情況用 while
  • 看到函式能找出輸入、輸出和 return 有沒有
  • 完成作業題目一:逐行說明函式和迴圈的運作
  • 完成作業題目二:請 AI 加上型別驗證並理解修改
  • 完成作業題目三:找出 if / elif 邏輯錯誤和 UnboundLocalError

延伸學習

把這篇文章分享給需要的人FacebookLINEThreadsX

常見問答

input() 讀到的使用者輸入,到底是什麼型別?
永遠是字串。就算使用者輸入的是 28,Python 拿到的是文字 "28",不是數字 28。要拿去做數學運算,必須自己用 int() 或 float() 轉型,AI 常常忘記做這一步。
多個獨立的 if 和 if / elif / else 有什麼不一樣?
多個獨立 if 每一句都會被檢查,可能同時成立、互相覆蓋;if / elif / else 是互斥的,條件成立一條就不會再看後面。需要「只走一條路」時一定要用 elif,不然分數等級這種判斷會悄悄算錯。
為什麼 10 / 2 算出來是 5.0 不是 5?
Python 的 / 是浮點數除法,結果永遠是 float,就算除得盡也一樣。需要整數結果要用 // 做整數除法,取餘數用 %。
函式忘記寫 return 會發生什麼事?
不會報錯,函式會安靜地回傳 None。如果之後拿這個結果去做運算,例如 None + 1,才會在下一行冒出 TypeError,這種延遲出現的錯誤特別難抓。
什麼時候該用 for,什麼時候該用 while?
清單逐項處理,或是已經知道要跑幾次,用 for;次數不確定、要等某個條件成立才停,用 while。等待使用者輸入有效值,常見寫法是 while True 搭配 break。