Python
你已經會用工具,現在要讀懂地圖: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 不是整數,四個最常見的地雷。
① 這個變數裝的是什麼型別?(字串、數字、還是串列?)
② 這個條件或迴圈的邏輯是什麼?(什麼情況走哪條路?)
③ 這個函式的輸入和輸出是什麼?(吃什麼、吐什麼?)
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、-7、0 | 計數、索引、年齡 |
float | 浮點數 | 3.14、99.9 | 價格、比率、座標 |
bool | 布林值 | True、False | 開關、條件判斷結果 |
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、""、None 是 False,其他都是 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"
[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。==(兩個等號)才是比較;=(一個等號)是指定if後面的程式碼必須縮排四個空格- 多個獨立
if和if/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")
while 迴圈忘記更新條件,或沒有 break,程式會永遠跑下去。看到 while 迴圈,確認條件變數有被更新,或有 break 能跳出。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,呼叫端拿到的是 None,不會馬上報錯,直到下一步運算才會爆出 TypeError。def add(a, b):
result = a + b # 計算了但沒有 return!
total = add(3, 5)
print(total) # None(不是 8)
- 名字:
def後面的名稱,說明函式在做什麼事 - 參數:括號裡的變數,是你需要提供的輸入
- return:函式執行完後給你的輸出,沒有
return就是None
calculate_bmi,輸入體重(kg,float)和身高(m,float),計算並回傳 BMI(float,保留兩位小數)。加上 docstring、型別註解,以及身高體重小於等於 0 時拋出 ValueError 的驗證。」2-6 型別陷阱與 AI 常見錯誤
型別錯誤是 Vibe Coder 最常遇到的 Bug,九成都是 AI 沒注意型別轉換。這四種陷阱認識了,你就能在程式崩潰前先看出問題。
陷阱一:字串和數字混用
"年齡是 " + age 會丟出 TypeError,字串不能直接加整數。age = 28
print("年齡是 " + age) # TypeError
f-string 讓 Python 自動處理,或者先用 str() 轉成字串再拼接。print(f"年齡是 {age}") # f-string 自動處理
print("年齡是 " + str(age)) # 先轉成字串
陷阱二: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: # 整數比整數,正確
陷阱四:/ 的結果永遠是浮點數
/ 一律回傳浮點數,就算除得盡也一樣。result = 10 / 2 # 結果是 5.0(float),不是 5(int)
//,取餘數用 %。result = 10 // 2 # 整數除法,結果是 5(int)
remain = 10 % 3 # 餘數,結果是 1
TypeError 訊息中的型別衝突。② 跳到錯誤行號。③ 請 AI 加 print(type(x)) 確認實際型別。三道遞進題:讀懂、改寫、抓錯
- 讀懂:變數、型別、迴圈、函式同時出現時,你要能逐行拆解
- 改寫: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}")
def calculate_average(numbers):定義函式,輸入是數字串列numbers,輸出是平均值(浮點數)。total = 0,再用for num in numbers:total += num把串列所有數字加總,+=是「在原有值上加」的縮寫。return total / len(numbers):總和除以元素個數,len()取得串列長度,回傳平均值。f"平均分數:{result:.1f}":其中.1f是格式化指令(保留一位小數),結果輸出「平均分數:87.8」。
題目二:改寫(進階)
任務:上面的 calculate_average 函式,如果傳入空串列會除以零崩潰,如果混入字串會報 TypeError。請 AI 用以下提示詞修正:
「請改進 calculate_average 函式,加上以下驗證:
1. 傳入的不是串列,拋出 TypeError 並說明原因
2. 串列是空的,拋出 ValueError 並說明原因
3. 串列裡有非數字的元素,跳過它並印出警告
請加上 docstring 說明參數型別和可能的例外。每行加中文註解。」
- 型別檢查:
if not isinstance(numbers, list):raise TypeError(...),用isinstance()確認傳入的是串列型別。 - 空串列檢查:
if len(numbers) == 0:raise ValueError(...),避免除以零錯誤。 - 非數字過濾:迴圈內加
if not isinstance(num, (int, float)):print(警告);continue,跳過非數字值繼續執行。
isinstance 做型別檢查。② 空串列有沒有被處理。③ 非數字元素是跳過還是中止程式。這三個判斷的差異會直接影響使用者體驗。題目三:抓錯(高階)
任務:找出以下程式碼至少兩個問題,說明危險原因,並寫出你會如何請 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 都會被判斷。輸入 95 時三個都成立,grade 被蓋三次,最終是「優秀」,看起來正確;但輸入 75 時,第一個和第二個條件都成立,最終是「良好」而非「及格」。邏輯上應該用 if / elif / elif / else 確保互斥。50 時,三個 if 都不成立,grade 從未被指定,return grade 拋出 UnboundLocalError。需要加 else:grade = "不及格" 處理這種情況。術語速查表
| 術語 | 說明 |
|---|---|
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 |
每次看到 AI 的程式碼,問這三個問題,你就不會只是複製貼上。
模組二完成清單
- 能說出四種基本型別各自的用途和範例值
- 知道
input()回傳字串,需要手動轉型 - 能用索引和切片取出字串的特定部分
- 能分辨
if / elif / else和多個獨立if的差異 - 能判斷什麼情況用 for、什麼情況用 while
- 看到函式能找出輸入、輸出和 return 有沒有
- 完成作業題目一:逐行說明函式和迴圈的運作
- 完成作業題目二:請 AI 加上型別驗證並理解修改
- 完成作業題目三:找出 if / elif 邏輯錯誤和 UnboundLocalError
延伸學習
ChatGPT 很強,但真正讓你下班的是 Google
六小時完整實錄。從「AI 很厲害,為什麼你還是每天加班」這個問題出發,把 Google Workspace 當成真正的工作平台重新設計一次流程 ── Sheets 的資料結構、Drive 與 Docs 的文件流、Gmail 與 Calendar 的通知系統,再用 Apps Script 讓它自己跑起來,最後收斂成一張屬於你自己的 AI 工作能力地圖。
NT$ 4,599
AI Native 工作法
四小時完整實錄。工作已經不是以前的工作了 ── 這門課拆解 AI Native 的四個核心能力,帶你把自己的工作做成一份可執行的 AI Native Blueprint,從「會用 AI 的人」變成「工作本身就長在 AI 上的人」。
NT$ 2,599

