National Central University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try an AI Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

3

Local AI

--

Uedu Code

--

中央大學 AQI 80 24°C PM2.5 21
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 21

變數、型別與控制流程

程式的基本元素:變數、運算、條件與迴圈
Interaction實作 30 minute(s)

Learning Objectives

  • 說明變數是記憶體裡有名字的位置,指派(=)是「先算右邊,再把結果放進左邊的名字」
  • 說明資料型別決定位元怎麼解讀、能做哪些運算,並在需要時轉換型別
  • 用條件判斷(if、elif、else)讓程式依情況走不同的路
  • 用迴圈(for、while)讓程式重複執行,說出結構化程式的三種控制結構

一支計步程式要做哪些事

手機的計步 App 每天都在做三件事:

  1. 記住資料:今天走了幾步、每天的目標是幾步
  2. 做判斷:步數有沒有達到目標?達到了就顯示恭喜的訊息
  3. 重複處理:一週七天,每一天都要加總、都要檢查

這三件事正好對應程式最基本的三個元素:變數(記住資料)、條件(做判斷)、迴圈(重複處理)。 不管是計步 App、銀行系統還是遊戲,程式都是由這些元素組合出來的。

這一課用 Python 當示範語言,因為它的寫法接近英文、容易讀。你不需要先學過程式; 重點是觀念,這些觀念在 C、Java、JavaScript 等語言裡都一樣,只是寫法稍有不同。

變數:記憶體裡有名字的位置

第 10 課提過,程式執行時資料都放在記憶體裡,每個位置有一個位址(一個數字)。 用位址找資料很不方便,所以程式語言讓你幫位置取名字,這就是變數(variable):

寫法 意思
steps = 3000 把 3000 放進名叫 steps 的位置
print(steps) 去 steps 那個位置把值拿出來
steps = steps + 2500 先算右邊:拿出 steps 目前的值加 2500;再放回左邊:結果存回 steps

最後一行常讓初學者困惑:在數學裡 x = x + 1 不可能成立,但在程式裡 = 不是「相等」,而是指派(assignment): 把右邊算出來的值放進左邊的名字。要比較是否相等,程式語言另外用 ==。

在 C 這類語言裡,變數就是一塊固定大小的記憶體;Python 的變數比較像貼在資料上的名牌。 兩種模型細節不同,但觀念一樣:用名字找到資料。

指派與交換:看變數的值怎麼變

按 ▶ 自動播放,或用「下一步」一行一行看。上方的方塊是變數目前的值,值有變化時會標示出來;還沒建立的變數顯示「—」。注意第 4 行 steps 的值是怎麼更新的,以及交換兩個值為什麼需要 temp。

型別:同樣的位元,不同的解讀

記憶體裡只有 0 和 1。同一個位元組 01000001,當成整數是 65,當成 ASCII 字元是 A。 資料型別(data type)告訴電腦:這些位元要怎麼解讀、可以做哪些運算。第 03~06 課看過的整數、浮點數、文字編碼,就是不同型別的表示方式。

型別 Python 名稱 範例 底層表示
整數 int 42、-7 二進位整數(第 04 課)
浮點數 float 3.14、0.1 IEEE 754(第 05 課),會有捨入誤差
字串 str "Hi"、"42" 一串字元的編碼(第 06 課)
布林 bool True、False 只有兩個值,用在判斷

型別決定運算的意思。同樣是 +,整數是相加,字串是接在一起:

>>> 3 + 4
7
>>> "3" + "4"
'34'
>>> 7 / 2        # 一般除法,結果是浮點數
3.5
>>> 7 // 2       # 整數除法,捨去小數
3
>>> 0.1 + 0.2    # 浮點數的捨入誤差
0.30000000000000004
>>> 3 + "4"      # 整數和字串不能直接相加
TypeError: unsupported operand type(s) for +: 'int' and 'str'

從鍵盤讀進來的資料(input())一律是字串,要拿來計算必須先轉換型別,例如 int("42") 得到整數 42。

互動練習:型別轉換

在 x = 輸入一個值,或點下面的按鈕換一個值,表格會顯示 type(x) 以及轉成 int、float、str、bool 的結果。比較看看:有引號的 "42" 和沒有引號的 42 型別一樣嗎?int("3.7") 為什麼會出錯,int(3.7) 又得到什麼?bool("0") 是 True 還是 False?

想一想:變數與型別

1.

下面的程式會印出什麼?

x = 5
y = x
x = x + 1
print(x, y)
2.

下面的程式會印出什麼?

print("2" + "3")
3.

記憶體裡有一個位元組 01000001。它代表的是什麼?

第 1 次作答

控制流程:程式不一定由上往下直直走

程式預設一行一行由上往下執行,這叫循序(sequence)。只有循序的話,程式每次都做一模一樣的事。 另外兩種結構讓程式能應付不同情況:

結構 意思 寫法
循序 一行接一行往下做 一般的敘述
選擇 依條件走其中一條路 if、elif、else
重複 條件成立就再做一次 for、while

1966 年,Böhm 與 Jacopini 在《Communications of the ACM》發表的論文證明:任何流程圖都可以只用循序、選擇、重複這三種結構改寫,不需要任意跳來跳去。 這是「結構化程式設計」的理論基礎,大多數程式語言都直接提供這三種結構。

條件判斷用比較運算產生布林值,再依結果選路:

運算 意思 範例(score 是 65)
>=、<=、>、< 大於等於、小於等於、大於、小於 score >= 60 是 True
==、!= 等於、不等於 score == 100 是 False
and、or、not 而且、或者、相反(第 08 課的布林邏輯) score >= 60 and score < 70 是 True

Python 用縮排標出「條件成立時要做的那幾行」;elif 是「否則,如果…」,else 是「以上都不成立」。

條件判斷:成績等級

程式從 input() 讀到 65。注意執行箭頭:if、elif 會一個一個檢查,第一個成立的那條路執行完,就跳過剩下的分支。下方可以改 input() 讀到的分數(例如 95、85、30)再跑一次,看箭頭走哪條路。

迴圈:讓電腦重複做事

電腦最擅長的就是不厭其煩地重複。常見的迴圈有兩種:

迴圈 什麼時候用 什麼時候停
for 變數 in 一串資料: 有一串資料要逐一處理(一週七天的步數、全班的成績) 資料拿完了
while 條件: 不知道要做幾次,只知道「什麼情況下要繼續」 條件變成 False

迴圈裡常見的寫法是累加:先準備一個從 0 開始的變數(例如 total = 0),每一圈把新的資料加進去。 迴圈裡也可以放條件判斷,例如「這一天有達標,達標天數就加 1」。

while 迴圈裡一定要有讓條件最後變成 False 的程式,否則迴圈永遠不會停,這叫無窮迴圈;程式看起來像當掉一樣。

迴圈:一週步數統計與存錢計畫

上半段的 for 把串列裡七天的步數一個一個拿出來給 steps,每一圈累加到 total,達標就讓 met 加 1。下半段的 while 每週存 300 元,存到 1000 元以上才停:數數看它跑了幾圈。

想一想:條件與迴圈

1.

下面的程式會印出什麼?

s = 95
if s >= 60:
    print("及格")
elif s >= 90:
    print("優秀")
else:
    print("不及格")
2.

下面的程式會印出什麼?

n = 1
while n < 20:
    n = n * 2
print(n)
3.

結構化程式設計認為任何程式都可以用哪三種控制結構組合出來?

第 1 次作答

實作:一週氣溫統計

串列 temps 是一週七天的最高氣溫。用迴圈算出「超過 30 度的天數」與「這週的最高溫」。補完兩個 TODO 後按「執行並檢查」。

你的輸出
預期輸出

重點整理

  • 變數是記憶體裡有名字的位置。= 是指派:先算右邊,再把結果放進左邊;比較相等要用 ==。
  • 型別決定位元怎麼解讀、能做哪些運算:int、float、str、bool。"3" + "4" 是 "34";input() 讀到的一律是字串,要計算得先轉型。
  • 條件:if、elif 由上往下檢查,第一個成立的分支執行完就跳過其他分支;and、or、not 組合條件。
  • 迴圈:for 逐一處理一串資料,while 在條件成立時重複;常搭配累加變數使用,while 要注意別寫成無窮迴圈。
  • 循序、選擇、重複三種結構就足以組合出任何程式。

下一課:程式變長之後,要怎麼把它切成一塊一塊、可以重複使用的小單元?這就是函式與模組化。

想把這些語法練得更熟,可以接著上 Python 軌的變數、條件與迴圈單元。

這一課完成了!
Next lesson:函式與模組化
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。