🗺️ 程式互動式地圖
零基礎起步・第 1 課

第一支程式:電腦怎麼一行一行執行

打了幾行字、按下執行,電腦到底做了什麼?為什麼有時候印出 7,有時候印出「3 + 4」,有時候只丟回一大段紅字?這一課從最小的程式開始,把執行順序和輸出畫面看清楚。

逐行執行播放器 出錯就停:三種寫法對照 輸出預測卡 12 張

💡 先搞懂問題

第一次打開程式編輯器的人,最常卡在幾個看起來很小、卻沒人解釋的地方:電腦是一次把整個檔案看完,還是一行一行看?為什麼 print("Hello") 可以順利印出字,少了引號的 print(Hello) 卻丟回一大段紅字?print(3 + 4) 和 print("3 + 4") 只差一對引號,結果怎麼會不一樣?紅字出現之後,下面那幾行到底有沒有跑?

先把幾個名詞對好。程式(program)就是寫給電腦的一份步驟清單;Python 程式是一個普通的文字檔,副檔名通常是 .py,裡面寫的內容叫原始碼(source code)。電腦本身看不懂這些英文字,需要一個專門讀 Python 的軟體來照著做,這個軟體叫 Python 直譯器(interpreter),「安裝 Python」其實就是在安裝它。直譯器照著程式做事的過程叫執行(run 或 execute):從檔案的第一行開始,一次一行,做完一行才換下一行,一路做到最後一行。程式想讓人看到的結果,要用 print() 印到輸出畫面上;沒有印出來的東西,就算電腦算過了,畫面上也什麼都看不到。

程式檔 cafe.py 輸出畫面 1print("早安,晴空咖啡") 2print("今日特調:", "桂花拿鐵") 3# 這一行是註解 4print(3 + 4) 5print("謝謝光臨") 早安,晴空咖啡 今日特調: 桂花拿鐵 7 謝謝光臨 (註解不執行) 直譯器由上往下,一次執行一行;每一個 print 在輸出畫面印出一行
左邊深色框是程式,右邊是執行後的輸出畫面。最左邊的藍色箭頭代表執行順序:第 1 行做完才做第 2 行。第 3 行以 # 開頭,是寫給人看的註解,直譯器直接跳過,所以輸出畫面上沒有對應的一行。

生活比喻:照著食譜卡做咖啡的新手店員

虛構的「晴空咖啡」來了一位新店員小安。第一天上班,店長給他一張食譜卡。小安非常守規矩:從第一步開始,一次只做一步,做完才看下一步,不跳步、也不自己調換順序。卡片上寫「在杯套上寫『熱的』」,他就一字不差地在杯套寫上「熱的」兩個字;寫「算出兩杯共幾元,寫在收據上」,他就先算好 65 乘以 2,再把算出來的 130 寫上去。卡片邊緣用鉛筆寫的小提醒,例如「這一步記得戴手套」,是給人看的備註,他不會把它當成一個步驟。

如果某一步寫著他完全看不懂的東西,例如「加入一份 Hello」,小安不會自己亂猜,而是立刻停手,跑去跟店長報告「第 3 步看不懂」。前面已經做好的咖啡還擺在吧台上,後面的步驟則一個都不會做。

咖啡店(比喻) Python 程式 食譜卡 程式檔(.py) 照做的店員小安 Python 直譯器 一次做一個步驟 一次執行一行(敘述) 寫在收據上給客人看 print() 印到輸出畫面 『熱的』照字抄上去 字串 "…":原樣印出 鉛筆寫的小提醒 註解 #:不執行 看不懂就停手回報 錯誤訊息(Traceback)
左欄是咖啡店裡的比喻,右欄是對應的程式名詞。最後一列用紅色標示:看不懂就停手,對應程式出錯時印出的錯誤訊息,後面的行不會再執行。
回到程式:食譜卡就是程式檔,小安就是 Python 直譯器,卡片上的一個步驟對應程式裡的一行(正式名稱叫敘述,statement)。寫在收據上、客人看得到的東西,對應用 print() 印到輸出畫面上的內容。『熱的』照字抄,對應用引號包起來的字串(string):引號裡寫什麼就印什麼。「算出兩杯共幾元」對應沒有引號的算式,Python 會先算出結果再印。鉛筆小提醒是註解(comment),以 # 開頭,直譯器會跳過。小安停手回報,就是程式出錯時印出的錯誤訊息,Python 稱為 Traceback。

這個比喻有兩個地方和實際不同。第一,真人店員看到「Print」大概會猜你想寫「print」,Python 完全不猜:大小寫差一個字母,就是另一個名字。Python 3.13 會在錯誤訊息裡加一句「Did you mean: 'print'?」提示你,但它只是建議,不會自動幫你改好再繼續。第二,Python 開始執行之前,其實會先把整個檔案很快地掃過一遍,檢查語法(syntax,也就是寫法規則):引號少一個、括號沒有成對這種「寫法本身就錯」的問題,在第一行執行之前就會被抓出來,整支程式一行都不跑。而「這個名字存不存在」這類問題,要真的執行到那一行才會發現,所以前面的行會照常執行。實驗室二和原理補完會把這兩種情況放在一起比較。

寫法 Python 怎麼理解 輸出畫面 print("3 + 4") print(3 + 4) print(Hello) 3 + 4 7 NameError 有引號=一段文字照抄,不計算 沒引號=一道算式先算出 7,再交給 print 沒引號的英文字=名字去找 Hello…找不到 引號決定「這是文字」還是「這是要 Python 去處理的東西」
同樣是 print,括號裡的東西有沒有引號,Python 的處理方式完全不同。第三列的 Hello 沒有引號,Python 會把它當成一個「名字」去找它代表什麼資料;這支程式從來沒有建立過這個名字,所以出錯。替資料取名字(變數)是第 2 課的主題。

🎮 互動實驗室一:看 Python 一行一行執行

下面是一支 9 行的小程式,Python 已經真的把它執行過一次,把每一步的狀態記錄下來。按「下一步 ▶」,就前進一行:左邊程式碼的綠色箭頭(➜)指著「下一個要執行的行」,黃色(▸)是剛執行完的那一行;最下面的黑色框是輸出畫面,print 印出的東西會一行一行長出來。出現黃色的「🤔 先猜猜看」時,先選答案再按下一步;按「自動播放」也會在這些地方自動暫停。拉動滑桿可以直接跳到任何一步。

畫面說明:按到第 3 步時注意綠色箭頭:它從第 2 行直接跳到第 4 行,第 3 行的註解完全沒有被執行。第 4 步和第 5 步是這一課最重要的對照:有引號的 "3 + 4" 原樣印出,沒有引號的 3 + 4 先算成 7 才印。右側「名字(變數)」與「物件」兩欄在這支程式裡會一直是空的,因為它只印東西、沒有替任何資料取名字;從第 2 課開始,每建立一個變數,左欄就會多一個名字、右欄多一個物件,中間用箭頭連起來。

🎮 互動實驗室二:出錯的那一行,程式就停了

同一段「開店流程」有三種寫法,用播放器右上角的選單切換:「忘了加引號」「Print 寫成大寫」「修好的版本」。每一種都從第一步按到最後一步,比較三件事:輸出畫面停在哪裡、紅色錯誤訊息的最後一行寫什麼、哪幾行從頭到尾都沒有輪到。

畫面說明:「忘了加引號」版本按到最後時,輸出畫面上還留著「開店準備」「煮咖啡」:前兩行在出錯之前就已經執行完,結果不會因為後面出錯而消失;第 4、5 行則從頭到尾沒有被執行。紅色的錯誤訊息要從最後一行往上讀:最後一行 NameError: name 'Hello' is not defined 說明「出了什麼錯」,上面的 line 3 說明「錯在第幾行」,^^^^^ 標出是那一行裡的哪幾個字。切到「Print 寫成大寫」,最後一行還會多出 Python 3.13 的建議:Did you mean: 'print'?

🎮 互動實驗室三:輸出預測卡

每張卡片是一小段程式。先在心裡當一次直譯器:從第一行往下,一次一行,遇到引號就照抄、沒有引號就先算,遇到不認識的名字就停。然後選出你認為的輸出畫面。答完會顯示 Python 3.13 實際執行的輸出和原因。共 12 張,順序隨機,可以按「重新洗牌」再練一輪。

答對 0 / 0
連續答對 0
畫面說明:選項分成好幾行時,代表輸出畫面上有好幾行;「(空白的一行)」代表印出一行什麼字都沒有的空行。答完後下方黑色框是真正的輸出畫面,紅字是錯誤訊息。

📘 原理補完

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 ( "單價" , 65 , "元" ) # 註解 1 2 3 4 5 6 7 一行 print 的零件 輸出畫面: 單價 65 元 1 print:內建函式的名字,全小寫 2 ( ):把要印的東西交給 print 3 "單價":字串,引號裡照抄 4 ,:逗號分隔,印出時變成空格 5 65:數字,沒有引號 6 "元":另一個字串 7 # 註解:到行尾都不執行 括號、引號、逗號都要用半形
一行 print 拆成七個零件。①② 是「呼叫 print 函式」的固定寫法;③⑤⑥ 是交給 print 的三個值(引數),用 ④ 逗號隔開;⑦ 是註解。右上角是這一行真正印出來的樣子:引號和逗號都不會出現在輸出畫面上。

print 有幾個固定的行為,記住就能預測輸出:括號裡用逗號隔開幾個值,就依序印出幾個值,中間各補一個半形空格;每次呼叫結束會自動換行,所以兩個 print 會印在兩行;括號裡什麼都不放(print())就印出一行空白。字串用單引號 '…' 或雙引號 "…" 都可以,只要前後成對,兩者完全相同。

2. 有引號、沒引號:一張比較表

下表每一列都用 Python 3.13 實際執行過,最右欄就是輸出畫面上看到的內容;出錯的列只列出錯誤訊息的最後一行。

寫法Python 怎麼理解輸出畫面
print("3 + 4")有引號:一段 5 個字元的文字,照抄3 + 4
print(3 + 4)沒引號:算式,先算出 77
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 知道錯在第幾行,下面一行是那一行的程式,^^^^^ 標出是哪幾個字惹的禍。

程式執行到哪裡 錯誤訊息(從最後一行往上讀) 1 print("開店準備")✓ 2 print("煮咖啡")✓ 3 print(Hello)✗ 4 print("開門營業") 5 print("今天辛苦了") 第 4、5 行沒有執行:程式在第 3 行就結束了 Traceback (most recent call last): File "main.py", line 3, in <module> print(Hello) ^^^^^ NameError: name 'Hello' is not defined 1 2 3 1 最後一行:錯誤種類 NameError+說明 2 line 3:錯在第 3 行 3 那一行的程式,^ 標出哪幾個字 開店準備、煮咖啡已經印出,不會消失
左邊是實驗室二「忘了加引號」的版本:第 1、2 行已經執行,輸出留在畫面上;第 3 行出錯,第 4、5 行從頭到尾沒有執行。右邊是真正的錯誤訊息,依編號 1、2、3 的順序讀。實際在電腦上執行時,File 後面會顯示你電腦上的完整檔案路徑,這裡簡寫成 main.py。

初學第一週最常遇到的錯誤,下面都用 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 會從第一行一路跑到最後一行才結束。

互動模式(>>>) 腳本檔 calc.py $ python >>> 3 + 4 7 >>> print("Hi") Hi >>> "3 + 4" '3 + 4' 13 + 4 2print("Hi") $ python calc.py Hi 第 1 行算出了 7,但沒有 print,所以看不到 互動模式會自動顯示運算式的值(字串會連引號一起顯示);腳本只顯示 print 印出的東西
黃字是 Python 的回應。互動模式為了方便試東西,會自動把每一行算出的值顯示出來,字串還會帶著引號,提醒你它是字串;腳本檔不會自動顯示,想看到什麼就要 print 什麼。這個差異常讓人困惑:同一行 3 + 4,在 >>> 後面會看到 7,寫進 .py 檔卻什麼都沒有。

實際寫程式時,大家多半透過下面幾種工具,背後其實都是同一個 Python 直譯器。安裝與設定的細節放在地圖「環境與工具」區塊,這裡先認識它們的差別:

在哪裡寫長什麼樣子適合做什麼地圖節點
互動模式(REPL)終端機輸入 python,出現 >>>,打一行執行一行;Python 3.13 起有彩色提示、可以編輯多行試一小段語法、當計算機;關掉視窗內容就不見了Python 安裝與版本
.py 腳本檔用任何編輯器寫好存成 .py,在終端機輸入 python 檔名.py 執行正式的程式;可以存檔、重複執行、交給別人編輯器與 IDE
IDLEWindows 與 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)。到時候播放器右邊的兩欄就會開始有東西:

1 drink = "桂花拿鐵" 2 price = 65 名字(變數) 物件(真正的資料) 全域(主程式) drinkprice 字串 str · o1 '桂花拿鐵' 整數 int · o2 65
和播放器同一套畫法:左欄是名字,右欄是物件,箭頭表示「這個名字貼在哪個物件上」。為什麼說「貼標籤」而不是「放進箱子」,第 2 課會用播放器一步一步看。

以後讀 AI 或資料分析的範例程式時,這一課的兩個觀念會一直出現:一是 print 是最常用的檢查工具,範例裡常看到 print(df.head())、print("準確率", score) 這種寫法,用來確認每一步的結果;二是程式由上往下執行,錯誤訊息最後一行告訴你出了什麼錯、上面告訴你錯在哪一行。

✅ 自我檢測

以下 6 題都是原創的小程式,答案都用 Python 3.13 實際執行核對過。選完會立即顯示對錯、解析和真正的輸出畫面,全部作答後會出現總分。目前得分:0 / 6