💡 先搞懂問題
第一次打開程式編輯器的人,最常卡在幾個看起來很小、卻沒人解釋的地方:電腦是一次把整個檔案看完,還是一行一行看?為什麼 print("Hello") 可以順利印出字,少了引號的 print(Hello) 卻丟回一大段紅字?print(3 + 4) 和 print("3 + 4") 只差一對引號,結果怎麼會不一樣?紅字出現之後,下面那幾行到底有沒有跑?
先把幾個名詞對好。程式(program)就是寫給電腦的一份步驟清單;Python 程式是一個普通的文字檔,副檔名通常是 .py,裡面寫的內容叫原始碼(source code)。電腦本身看不懂這些英文字,需要一個專門讀 Python 的軟體來照著做,這個軟體叫 Python 直譯器(interpreter),「安裝 Python」其實就是在安裝它。直譯器照著程式做事的過程叫執行(run 或 execute):從檔案的第一行開始,一次一行,做完一行才換下一行,一路做到最後一行。程式想讓人看到的結果,要用 print() 印到輸出畫面上;沒有印出來的東西,就算電腦算過了,畫面上也什麼都看不到。
生活比喻:照著食譜卡做咖啡的新手店員
虛構的「晴空咖啡」來了一位新店員小安。第一天上班,店長給他一張食譜卡。小安非常守規矩:從第一步開始,一次只做一步,做完才看下一步,不跳步、也不自己調換順序。卡片上寫「在杯套上寫『熱的』」,他就一字不差地在杯套寫上「熱的」兩個字;寫「算出兩杯共幾元,寫在收據上」,他就先算好 65 乘以 2,再把算出來的 130 寫上去。卡片邊緣用鉛筆寫的小提醒,例如「這一步記得戴手套」,是給人看的備註,他不會把它當成一個步驟。
如果某一步寫著他完全看不懂的東西,例如「加入一份 Hello」,小安不會自己亂猜,而是立刻停手,跑去跟店長報告「第 3 步看不懂」。前面已經做好的咖啡還擺在吧台上,後面的步驟則一個都不會做。
# 開頭,直譯器會跳過。小安停手回報,就是程式出錯時印出的錯誤訊息,Python 稱為 Traceback。
這個比喻有兩個地方和實際不同。第一,真人店員看到「Print」大概會猜你想寫「print」,Python 完全不猜:大小寫差一個字母,就是另一個名字。Python 3.13 會在錯誤訊息裡加一句「Did you mean: 'print'?」提示你,但它只是建議,不會自動幫你改好再繼續。第二,Python 開始執行之前,其實會先把整個檔案很快地掃過一遍,檢查語法(syntax,也就是寫法規則):引號少一個、括號沒有成對這種「寫法本身就錯」的問題,在第一行執行之前就會被抓出來,整支程式一行都不跑。而「這個名字存不存在」這類問題,要真的執行到那一行才會發現,所以前面的行會照常執行。實驗室二和原理補完會把這兩種情況放在一起比較。
🎮 互動實驗室一:看 Python 一行一行執行
下面是一支 9 行的小程式,Python 已經真的把它執行過一次,把每一步的狀態記錄下來。按「下一步 ▶」,就前進一行:左邊程式碼的綠色箭頭(➜)指著「下一個要執行的行」,黃色(▸)是剛執行完的那一行;最下面的黑色框是輸出畫面,print 印出的東西會一行一行長出來。出現黃色的「🤔 先猜猜看」時,先選答案再按下一步;按「自動播放」也會在這些地方自動暫停。拉動滑桿可以直接跳到任何一步。
"3 + 4" 原樣印出,沒有引號的 3 + 4 先算成 7 才印。右側「名字(變數)」與「物件」兩欄在這支程式裡會一直是空的,因為它只印東西、沒有替任何資料取名字;從第 2 課開始,每建立一個變數,左欄就會多一個名字、右欄多一個物件,中間用箭頭連起來。🎮 互動實驗室二:出錯的那一行,程式就停了
同一段「開店流程」有三種寫法,用播放器右上角的選單切換:「忘了加引號」「Print 寫成大寫」「修好的版本」。每一種都從第一步按到最後一步,比較三件事:輸出畫面停在哪裡、紅色錯誤訊息的最後一行寫什麼、哪幾行從頭到尾都沒有輪到。
NameError: name 'Hello' is not defined 說明「出了什麼錯」,上面的 line 3 說明「錯在第幾行」,^^^^^ 標出是那一行裡的哪幾個字。切到「Print 寫成大寫」,最後一行還會多出 Python 3.13 的建議:Did you mean: 'print'?🎮 互動實驗室三:輸出預測卡
每張卡片是一小段程式。先在心裡當一次直譯器:從第一行往下,一次一行,遇到引號就照抄、沒有引號就先算,遇到不認識的名字就停。然後選出你認為的輸出畫面。答完會顯示 Python 3.13 實際執行的輸出和原因。共 12 張,順序隨機,可以按「重新洗牌」再練一輪。
📘 原理補完
1. 程式、直譯器與「由上往下」
Python 屬於直譯式語言(interpreted language):寫好的 .py 檔不需要先轉成另一個執行檔,直接交給 Python 直譯器執行。嚴格來說,直譯器會先把整個檔案檢查一遍語法,再轉成一種內部格式(位元組碼,bytecode)逐步執行,但從寫程式的人看出去,效果就是「由上往下,一次一行」。這個順序叫執行順序(flow of execution)。之後學到的條件判斷(第 7 課)、迴圈(第 8 課)、函式(第 9 課),都是在改變「下一行要跳到哪裡」,但每一刻電腦仍然只在做一行。
官方文件裡常見的幾個詞:一行完整的指令叫敘述(statement);像 3 + 4 這種會算出一個值的片段叫運算式(expression);print 是 Python 內建的函式(built-in function),在名字後面加上括號就是呼叫(call)它,括號裡交給它的值叫引數(argument)。用引號包起來的文字叫字串(string,型別名稱是 str),直接寫在程式裡的 "早安" 正式名稱是字串常值(string literal)。
print 有幾個固定的行為,記住就能預測輸出:括號裡用逗號隔開幾個值,就依序印出幾個值,中間各補一個半形空格;每次呼叫結束會自動換行,所以兩個 print 會印在兩行;括號裡什麼都不放(print())就印出一行空白。字串用單引號 '…' 或雙引號 "…" 都可以,只要前後成對,兩者完全相同。
2. 有引號、沒引號:一張比較表
下表每一列都用 Python 3.13 實際執行過,最右欄就是輸出畫面上看到的內容;出錯的列只列出錯誤訊息的最後一行。
| 寫法 | Python 怎麼理解 | 輸出畫面 |
|---|---|---|
print("3 + 4") | 有引號:一段 5 個字元的文字,照抄 | 3 + 4 |
print(3 + 4) | 沒引號:算式,先算出 7 | 7 |
print("3", "+", "4") | 三段文字,用逗號隔開,中間各補一個空格 | 3 + 4 |
print("Hello") | 一段文字,照抄 | Hello |
print('Hello') | 單引號也是字串,和雙引號一樣 | Hello |
print(Hello) | 沒引號的英文字:當成名字去找,找不到 | NameError: name 'Hello' is not defined |
Print("Hello") | 大寫 Print 是另一個名字,找不到 | NameError: name 'Print' is not defined. Did you mean: 'print'? |
print() | 括號裡沒有東西:印一行空白 | (一行空白) |
print("單價", 65) | 文字和數字混在一起,用逗號隔開 | 單價 65 |
判斷步驟可以濃縮成三句:看到引號,裡面是照抄的文字;沒有引號的數字和算式,先算出結果;沒有引號的英文字(或中文字),是一個「名字」,Python 會去找它代表什麼,找不到就出錯。
3. 註解:寫給人看的筆記
註解(comment)從 # 開始,一直到這一行結束,直譯器完全不理會。它有兩種用途:一是說明這一段程式在做什麼、為什麼這樣寫,幾個月後的自己和同事都會感謝你;二是在一行前面加上 #,讓它暫時不執行,除錯時很常用,俗稱「把它註解掉」。要注意 # 如果出現在引號裡面,例如 print("#1 號桌"),它只是字串裡的一個字元,不是註解。
4. 出錯的時候:程式停在哪裡、訊息怎麼讀
執行到某一行發現做不下去時,Python 會停止整支程式,印出一段錯誤訊息,正式名稱是 Traceback(追溯紀錄)。讀它的順序和寫的順序相反:先看最後一行,那裡寫著錯誤的種類(例如 NameError)和一句說明;再往上看 line 3 知道錯在第幾行,下面一行是那一行的程式,^^^^^ 標出是哪幾個字惹的禍。
初學第一週最常遇到的錯誤,下面都用 Python 3.13 實際執行取得。前兩個是 NameError(名字錯誤):執行到那一行才發現名字不存在。
忘了加引號,文字被當成名字:
print(Hello)
Traceback (most recent call last):
File "main.py", line 1, in <module>
print(Hello)
^^^^^
NameError: name 'Hello' is not defined大小寫打錯,Python 3.13 會猜你想打的是哪個名字:
Print("Hello")
Traceback (most recent call last):
File "main.py", line 1, in <module>
Print("Hello")
^^^^^
NameError: name 'Print' is not defined. Did you mean: 'print'?接下來三個是 SyntaxError(語法錯誤):寫法本身不符合規則,Python 在執行第一行之前就發現了,所以整支程式一行都不會跑。比較下面這段:第 1 行明明是正確的 print("開店準備"),輸出畫面上卻什麼都沒有,只剩錯誤訊息。這就是和 NameError 最大的不同。
print("開店準備")
print("Hello)
print("開門營業")
File "main.py", line 2
print("Hello)
^
SyntaxError: unterminated string literal (detected at line 2)全形符號是中文使用者最常踩的雷:在中文輸入法下打出的括號()、引號「」“”、逗號,,在 Python 眼裡都是看不懂的字元。訊息裡的 U+FF08 是這個字元的編號,看到 invalid character 就先檢查輸入法。
print("Hello")
File "main.py", line 1
print("Hello")
^
SyntaxError: invalid character '(' (U+FF08)照抄舊教材:網路上有些很舊的範例是 Python 2 的寫法,print 後面沒有括號。Python 3 一律要加括號:
print "Hello"
File "main.py", line 1
print "Hello"
^^^^^^^^^^^^^
SyntaxError: Missing parentheses in call to 'print'. Did you mean print(...)?錯誤訊息的完整讀法、更多錯誤種類和除錯方法,第 10 課會專門整理。現在只要記住兩件事:先讀最後一行,以及「前面的輸出還在,後面的沒跑」。
5. 去哪裡寫、怎麼執行
同樣的 Python 程式,可以在好幾種地方寫和執行。最基本的分法是互動模式和腳本檔。在終端機(Windows 的命令提示字元或 PowerShell、macOS 的「終端機」)輸入 python(Windows 也可以用 py)會出現 >>> 提示符號,這就是互動模式,正式名稱是 REPL(Read–Eval–Print Loop,讀取、執行、顯示、再來一次):打一行、按 Enter,它馬上執行並顯示結果。把程式存成 .py 檔再執行,叫腳本(script),Python 會從第一行一路跑到最後一行才結束。
3 + 4,在 >>> 後面會看到 7,寫進 .py 檔卻什麼都沒有。實際寫程式時,大家多半透過下面幾種工具,背後其實都是同一個 Python 直譯器。安裝與設定的細節放在地圖「環境與工具」區塊,這裡先認識它們的差別:
| 在哪裡寫 | 長什麼樣子 | 適合做什麼 | 地圖節點 |
|---|---|---|---|
| 互動模式(REPL) | 終端機輸入 python,出現 >>>,打一行執行一行;Python 3.13 起有彩色提示、可以編輯多行 | 試一小段語法、當計算機;關掉視窗內容就不見了 | Python 安裝與版本 |
| .py 腳本檔 | 用任何編輯器寫好存成 .py,在終端機輸入 python 檔名.py 執行 | 正式的程式;可以存檔、重複執行、交給別人 | 編輯器與 IDE |
| IDLE | Windows 與 macOS 的官方安裝檔附帶的簡易工具,有互動視窗,也能開 .py 檔按 F5 執行 | 剛裝好 Python、還沒有其他工具時 | Python 安裝與版本 |
| VS Code | 免費的程式編輯器,安裝 Python 擴充套件後按右上角 ▶ 執行,輸出出現在下方的終端機 | 長期寫程式、管理多個檔案、除錯 | 編輯器與 IDE |
| Jupyter/Colab | 程式分成一格一格,執行後輸出顯示在格子正下方;Colab 用瀏覽器打開就能寫,不用安裝 | 資料分析、AI 範例;最快的「零安裝」起點 | Jupyter 與 Colab |
Notebook 的每一格有一點像互動模式:格子最後一行如果是運算式,會自動顯示它的值。但規則仍然一樣,同一格裡由上往下執行,出錯就停在那一行。
6. 兩段完整範例
範例 1:印一張收據。把這一課的寫法全部用上:字串照抄、逗號分隔、文字和數字混用、算式先算再印、空白行。
# 晴空咖啡:今日收據(範例 1)
print("晴空咖啡") # 店名
print("品項:", "桂花拿鐵") # 逗號會自動補一個空格
print("單價", 65, "元") # 文字和數字可以混在一起
print("數量", 2, "杯")
print("合計", 65 * 2, "元") # 沒有引號:先算出 130
print() # 印一行空白
print("謝謝光臨")
晴空咖啡 品項: 桂花拿鐵 單價 65 元 數量 2 杯 合計 130 元 謝謝光臨
範例 2:用註解找問題。某一行出錯時,可以先在前面加 # 讓它暫時不執行,確認其他部分正常,再回頭修。第 3 行就是被註解掉的錯誤寫法,第 4 行是修好的版本。最後一行示範同一個 print 裡,前半是照抄的文字、後半是算式。
# 範例 2:用註解暫時關掉一行,找出問題在哪
print("步驟 1:開機")
# print(步驟2) # 這行少了引號,先註解掉讓程式能跑完
print("步驟 2:磨豆") # 修好的寫法
print("3 + 4 =", 3 + 4) # 前面是文字照抄,後面是算式
print("完成")
步驟 1:開機 步驟 2:磨豆 3 + 4 = 7 完成
7. 下一課預告:替資料取名字
這一課的程式只會「印完就忘」:算出的 130 印到畫面上之後,程式並沒有記住它。如果想在後面的行再用到同一個值,就要替它取一個名字,這就是第 2 課的變數(variable)。到時候播放器右邊的兩欄就會開始有東西:
以後讀 AI 或資料分析的範例程式時,這一課的兩個觀念會一直出現:一是 print 是最常用的檢查工具,範例裡常看到 print(df.head())、print("準確率", score) 這種寫法,用來確認每一步的結果;二是程式由上往下執行,錯誤訊息最後一行告訴你出了什麼錯、上面告訴你錯在哪一行。
✅ 自我檢測
以下 6 題都是原創的小程式,答案都用 Python 3.13 實際執行核對過。選完會立即顯示對錯、解析和真正的輸出畫面,全部作答後會出現總分。目前得分:0 / 6