Python 編程

初中電腦認知 · 資料處理

Python 編程

編寫真正的 Python 程式:接收輸入、計算、作判斷、重複執行、發出聲音和擲骰子。每個例子都可以直接在投影片上執行,改一改再試。

← → 或 PgUp PgDn 轉頁 O 所有投影片N 教師筆記T 計時器F 全螢幕Ctrl+Enter 執行程式Esc 離開程式碼框,方向鍵便可再轉頁

程式做甚麼?

程式是一連串指令,電腦會按次序執行。大部分程式都會接收輸入、進行處理,然後產生輸出。

輸入

→

處理

→

輸出

  • 在 Python,input() 從鍵盤讀取資料,print() 把資料顯示在屏幕上。
  • Python 會由上至下逐行執行。

用 print() 輸出

print() 把資料顯示在屏幕上。文字要放在引號內;數字和算式則不用。

print("你好") → 你好
print(3 + 4) → 7
print("3 + 4") → 3 + 4
print("年齡", 13) → 年齡 13
  • 用逗號可以一次輸出多項,中間自動加一個空格。
  • + 會把文字連接起來,中間沒有空格。數字要先用 str() 轉成文字。
  • sep= 改變項目之間的分隔符號;end="" 令 print 不換行。
  • 文字中的 \n 代表換行。單獨一句 print() 會輸出一個空行。
不用 f-string本課程只用逗號、+ 和 str() 來組合輸出。

從鍵盤輸入

input() 會顯示提示訊息,等待使用者輸入並按 Enter,然後交回輸入的內容。

name = input("你叫甚麼名字?")
age = int(input("年齡:"))
height = float(input("身高(米):"))
  • input() 交回的一定是文字(字串),就算輸入的是數字也一樣。
  • 要計數的話,先用 int()(整數)或 float()(小數)包住它。
  • 提示訊息最後加一個空格,答案便不會黏住問題。
試一試執行「文字陷阱」,輸入 3 和 4。為甚麼會得到 34?

變數:有名字的盒子

變數就像一個有名字的盒子,用來儲存數值。= 的意思是「把右邊的值放入左邊的盒子」。

  • score = score + 10 的意思是:取出舊的 score,加 10,再放回去。這是賦值,不是數學方程。
  • 每個盒子只會保留最新的值。
  • 命名規則:可用英文字母、數字和 _,不可以數字開頭,不可有空格。Score 和 score 是不同的變數。
  • 用一看便明白的名稱:total_price 比 tp 好。
好名稱還是壞名稱?age ✔   my score ✘   2nd ✘   player_2 ✔   print ✘
逐步執行程式按「下一步」看盒子的變化

算術運算符

Python 有七個算術運算符。改變 a 和 b,看看每個結果。

運算符探索試試 b = 0 或負數 a
運算次序先計括號,然後 **,再到 * / // %,最後 + -,與數學一樣。

文字還是數字?int()、float()、str()

每個值都有資料類型。類型決定 + 的作用:數字會相加,文字會連接。

類型例子轉換方法
int(整數)13, -5int("13") → 13
float(小數)1.58, 2.0float("1.58") → 1.58
str(文字)"小明", "13"str(13) → "13"
"13" + "1" → "131"
13 + 1 → 14
"13" + 1 → TypeError 錯誤 ✘
簡單法則從 input() 得到的數字要用 int() 或 float();用 + 跟文字連接的數字要用 str()。

程式例子:輸入 → 處理 → 輸出

四個短程式,用上了目前學過的所有內容。選一個執行,然後修改它。

挑戰 1:長方形

加一行輸出對角線的長度。提示:(length ** 2 + width ** 2) ** 0.5

挑戰 2:溫度

寫一個相反的程式:華氏轉攝氏。c = (f - 32) * 5 / 9

挑戰 3:夾錢

改為讓使用者輸入服務費百分比,而不是固定一成。

挑戰 4:分鐘

用 // 和 % 把秒數轉換成分鐘和秒。

先計劃,後編程先寫下三部分的註解:# 輸入、# 處理、# 輸出。

例題:找續

一步一步看程式如何建立:理解問題、計劃、逐部分編寫,最後測試。

逐步建立按「下一步」

練習:輸入與變數

逐級向上:預測 → 填充 → 除錯 → 修改 → 創作。每升一級,提示就少一點。

小測:輸入與變數

字串:連接、重複、量度

字串是放在引號內的文字。每個字元都有一個位置編號,稱為索引,由 0 開始。

字串探索點選字元,拖動滑桿
"朱古力" + "雪糕" → "朱古力雪糕"
"哈" * 3 → "哈哈哈"
len("你好嗎") → 3
word[0] word[-1] word[0:3]
  • + 連接字串;* 重複字串。
  • len() 計算字元數目,空格也計算在內。
  • word[-1] 是最後一個字元。word[a:b] 由 a 開始取到 b 之前(不包括 b)。

字串指令

字串有內置的指令(方法)。寫法是:字串、一點,然後指令,例如 text.upper()。

指令遊樂場點選一個指令

指令作用
upper() lower() title()改變英文大細楷
replace(a, b)把所有 a 換成 b
count(x) find(x)x 出現多少次;x 第一次出現的位置(找不到是 -1)
center(n, "*")把文字放在 n 格的中間
text[::-1]把文字倒轉
注意指令會產生一個新字串。要保留改變,便要存起來:name = name.upper()。

例題:用戶名稱產生器

切片、字串指令和連接一起使用,把名字變成用戶名稱。

逐步建立按「下一步」

有趣的文字效果

結合 print()、字串指令、迴圈和 time.sleep(),便可以在屏幕上製作文字動畫。

  • 先 import time,然後 time.sleep(0.5) 會暫停半秒。
  • print(x, end="", flush=True) 會在同一行輸出,並即時顯示,這就是打字機效果的秘訣。
  • "*" * n 和 " " * n 可以砌出進度列、樓梯和波浪。
  • center() 可以造出整齊的橫額。
迴圈預告這些效果用了 for 迴圈來重複。下一個課題會詳細學習迴圈。

發出聲音

winsound.Beep(頻率, 時間) 會播放一個音。頻率是音高,單位是赫茲(Hz);時間的單位是毫秒(1000 毫秒 = 1 秒)。

鋼琴變 Python彈奏琴鍵,然後把旋律送到程式碼框
winsound.Beep(262, 300)
數字越大 = 音越高頻率加倍便會高一個八度:262 → 524。
  • 先寫 import winsound。Windows 電腦的 Python 已內置這個模組。
  • print("\a") 會在終端機或命令提示字元響鈴。
  • 把音符放進串列,再用迴圈逐個播放,便成為一段旋律。

延伸:用 ord() 和 chr() 製作密碼

每個字元都以一個數字儲存。ord("A") 得出 65;chr(66) 得出 "B"。把每個字母向後移 3 位,就是凱撒密碼。

凱撒密碼輪改變移位

練習:文字與聲音

逐級向上:預測 → 填充 → 除錯 → 修改 → 創作。

小測:文字與聲音

關係運算符

關係運算符用來比較兩個值,結果一定是 True(真)或 False(假),稱為布爾值。

意思課程寫法Python
大於>>
大於或等於>=>=
小於<<
小於或等於<=<=
等於===
不等於<>!=
小心在 Python,一個 = 是儲存數值(賦值);要比較就要用兩個:==。課程中的 <> 在 Python 寫成 !=。
比較機試把兩個數設成相等

邏輯運算符:and、or、not

邏輯運算符用來組合 True/False 條件。課程寫作 AND、OR、NOT;Python 則用小楷 and、or、not。

意思課程寫法Python
兩者都是 True 才是 TrueANDand
至少一個是 True 便是 TrueORor
把 True 和 False 對調NOTnot
真假開關板點選 A 和 B
我可以玩過山車嗎?規則:年齡 ≥ 12 及身高 ≥ 140

作出判斷:if、elif、else

流程控制讓程式選擇執行哪些句子。Python 會由上而下檢查條件,並執行第一個是 True 的部分。

跟着流程圖走拖動分數
開始 輸入 mark mark >= 80? mark >= 50? 輸出 優異! 輸出 合格 輸出 再接再厲 結束 是否 是否
  • 條件句最後要加冒號 :。
  • 內裏的句子要縮排 4 個空格,縮排表示哪些句子屬於該 if。
  • elif 即「否則如果」。else 處理餘下所有情況,不需要條件。

巢狀 if:判斷之中再判斷

當下一條問題要視乎第一個答案才需要問時,便把 if 放在另一個 if 之內。內層分支甚至可以用 input() 再提問。

路徑探索選擇答案
用戶名稱
密碼
if 第一條問題: # 0 格 答案 = input(...) # 4 格 if 第二條問題: # 4 格 print(...) # 8 格 else: print(...) else: print(...)
  • 每多一層巢狀便多縮排 4 格。每個 else 要與它所屬的 if 對齊。
  • 內層的 input() 只會在該路徑執行,使用者不會被問到不相關的問題。
  • 如果中間不用再提問,用 and 通常更簡單:if age >= 12 and height >= 140:

例題:電影票(巢狀 if)

真實的收費規則需要一個判斷、在其中一條路徑多問一條問題,以及一個適用於所有人的調整。

逐步建立按「下一步」

日常生活中的迴圈

迴圈就是重複執行步驟。有些迴圈重複固定次數(for);有些則重複到條件改變為止(while)。

🏃繞跑道跑 4 個圈

for 次數已知。 for lap in range(4):

🪥逐隻牙齒刷

for 每一項重複一次。 for tooth in teeth:

⏰鬧鐘「再響」

while 仍在睡覺便繼續重複。 while asleep:

🚦交通燈

while 紅 → 綠 → 黃,整天不停重複。 while True:

🍜攪拌麵條直至變軟

while 不知道要攪多少次,每次都要檢查。 while not soft:

🎵副歌唱 3 次

for 固定次數。 for i in range(3):

🔐手機密碼

while 不斷要求輸入,直至密碼正確(或錯誤太多次)。 while code != "1234":

🧺洗衣機過水

for 程式設定了過水的次數。 for rinse in range(3):

🎮遊戲:還有生命便繼續玩

while while lives > 0:

輪到你想想家中或學校還有甚麼迴圈?它是計數迴圈(for)還是條件迴圈(while)?

計數迴圈:for 和 range()

for i in range(開始, 停止, 步長): 會為每個數字執行一次縮排了的句子。停止值本身不包括在內。

range() 視覺化試試負數步長

range(5) → 0 1 2 3 4
range(1, 6) → 1 2 3 4 5
range(2, 11, 2) → 2 4 6 8 10
range(5, 0, -1) → 5 4 3 2 1
  • 知道要重複多少次時,便用 for。
  • 迴圈變數(i)會依次取得每個值,可以在迴圈內使用。
  • for letter in "HELLO": 會逐個字元重複。

條件迴圈:while

while 條件: 只要條件是 True 便會一直重複。迴圈內必須有東西改變,否則永遠不會停。

逐步執行 while 迴圈留意 n 和 total
  • 每次重複之前都會檢查條件。
  • 不知道要重複多少次時用 while:密碼、遊戲、「一直加到輸入 0 為止」。
  • 無限迴圈永遠不會結束。在這裏按 ■ 停止;在 IDLE 按 Ctrl+C。
試一試在「1 加到 4」中刪去 n = n + 1 一行再執行,會發生甚麼事?然後按停止。

流程控制與迴圈的簡單程式

真正的程式會在迴圈中加入 if、計數器和總和。先閱讀並預測結果,然後才執行。

常用模式程式碼
計數器count = count + 1
累加總和total = total + mark
旗標correct = True
終止值while item != "end":
「三次機會」中輸入 1111、2222、1234 會輸出甚麼?

已解鎖!第三次輸入正確,迴圈結束時 correct = True。

怎樣修改「雙數」程式來輸出單數?

range(1, 21, 2):由 1 而不是 2 開始。

在「平均分」輸入 0 個學生會出現甚麼問題?

ZeroDivisionError:total / 0。可用 if count > 0: 修正。

例題:分數分析器

一個迴圈,加上累加總和、計數器和「目前最高」:大部分資料處理程式都用這三種模式。

逐步建立按「下一步」

延伸:巢狀迴圈圖案與 break

迴圈內再有迴圈,稱為巢狀迴圈:外迴圈每轉一次,內迴圈便完整執行一遍。break 可提早離開迴圈。

for row in range(3):
for col in range(4):
print("*", end="")
print()
  • 外迴圈 = 行;內迴圈 = 每行的項目。
  • 內迴圈之後的 print() 用來換行。
  • break 在找到想要的結果後立即停止迴圈。

練習:判斷與迴圈

八個練習,由預測 True/False 到編寫內有 input() 的巢狀 if,以及帶計數器的迴圈。

小測:判斷與迴圈

隨機數

隨機數產生器會產生無法預測的數字。遊戲、抽獎和模擬都會用到。

指令結果
import random載入 random 模組(在最頂寫一次)
random.randint(1, 6)1 至 6 的整數,包括兩端
random.random()0 至 1(不包括 1)的小數
random.choice(list)從串列中選出一項
你知道嗎?電腦只會按規則運作,所以它的隨機數其實是偽隨機數:由巧妙的公式產生,看起來很隨機。
產生一組整數產生兩次,數字一樣嗎?

觀察隨機性:有沒有規律?

數量少時,隨機結果看來不平均,又會連續出現。數量多時,每個值出現的次數會大致相同,但我們仍然無法預測下一個數。

隨機實驗室:1 至 610 → 100 → 10000
每個預期
最多/最少
最長連續
平均值
  • 樣本少:棒形高低差別很大,有些數字甚至沒有出現。
  • 樣本多:棒形會接近預期值,變得平均。平均值接近 3.5。
  • 連續出現很正常。6、6、6 與 2、5、1 出現的機會一樣。
討論連續四次擲出 6,下一次擲出 6 的機會會減少嗎?(不會,每次擲骰都是獨立的。)

模擬骰子

只需一行:roll = random.randint(1, 6)。加上 if 和迴圈,便可變成遊戲。

骰子模擬器擲一次,再擲 600 次

算術測驗產生器

隨機數 + input() + if + 迴圈 + 分數變數 = 每次都不同的測驗。

全班挑戰輸入答案後按 Enter
a = random.randint(1, 10)
b = random.randint(1, 10)
answer = int(input(...))
if answer == a + b:
score = score + 1
  • 用 str(a) + " x " + str(b) 組成題目,不用 f-string。
  • random.choice(["+", "-", "x"]) 選出運算;if/elif 計算正確答案。

練習:隨機數與測驗

由一行隨機數,到結合 while、if/elif 和巢狀 if 的完整計算機選單。

各種簡單的編程專題

選一個專題,載入起始程式碼並執行,然後完成挑戰,把它變成你自己的作品。

專題檢查清單1. 計劃輸入、處理、輸出。2. 先寫一小部分並測試。3. 用一般、邊界和奇怪的輸入測試。4. 加上註解。5. 請同學試用。

延伸:看懂錯誤訊息

出錯是正常的。錯誤訊息會告訴你行號和問題的類型。修正每個錯誤,再執行一次。

錯誤常見原因
SyntaxError漏了 : ) 或 ";把 == 寫成 =
IndentationErrorif/for/while 內的句子沒有縮排
NameError串錯字,或文字沒有加引號
TypeError用 + 連接文字和數字
ValueErrorint("abc"):不是數字
ZeroDivisionError除以 0

Python 練習場

一個空白的地方讓你與全班即場編程。本教材所有內容都可以在這裏使用:輸入、輸出、計算、字串、聲音、if、迴圈和隨機數。

小測:隨機數與專題

Python 速查表

整套教材的重點都在這一頁。按「前往」返回相關投影片。

輸出

print("你好", name)
print("總數:" + str(t))
print("A", end="")

輸入

name = input("名字:")
n = int(input("數字:"))
x = float(input("價錢:"))

變數與計算

score = score + 1
+  -  *  /  //  %  **

字串

"Ha" * 3     len(s)    s[0]
s.upper()  s.replace("a", "b")
s.center(20, "*")   s[::-1]

效果與聲音

import time, winsound
time.sleep(0.5)
winsound.Beep(440, 500)

比較與組合

>  >=  <  <=  ==  !=
課程 =  → ==    <> → !=
AND OR NOT → and or not

判斷

if mark >= 80:
    print("A")
elif mark >= 50:
    print("合格")
else:
    print("不合格")

巢狀 if

if user == "admin":
    pw = input("密碼:")
    if pw == "py123":
        print("歡迎")
    else:
        print("錯誤")

迴圈

for i in range(1, 11):
    print(i)
while answer != "yes":
    answer = input("? ")

隨機數

import random
roll = random.randint(1, 6)
pick = random.choice(names)
離堂問題設計一個程式:擲兩粒骰子 100 次,並點算出現多少次「一對」。你需要用到這一頁哪些指令?

建議教學流程

約十一節 40 分鐘的課,另加 2 至 3 節做小型專題。點選投影片名稱便可前往。

課節課程重點投影片學生任務
1輸入與輸出用自己的問題寫打招呼程式
2變數及賦值中的算術運算例子投影片的挑戰 1–4
3例題與練習練習第 1–5 級
4處理文字;文字效果;聲音名字橫額 + 一段短旋律
5練習:文字與聲音練習第 1–5 級
6關係及邏輯運算符;if過山車檢查、評級程式
7內有輸入的巢狀 if為每條路徑寫測試表
8日常生活中的迴圈;for 和 while乘數表、密碼迴圈
9流程控制與迴圈的簡單程式巴士車費(巢狀 if)、炎熱日子
10隨機數、規律、骰子擲 600 次骰子統計
11算術測驗五題計分測驗;計算機選單
12–14各種簡單專題二人專題及向全班簡短示範
電腦室設定學生可以把相同的程式碼輸入 IDLE(從 python.org 安裝 Python 時已附帶)或 Thonny。winsound 只適用於 Windows;其他電腦可改用 print("\a") 或略過聲音部分。本教材在網頁內執行 Python,所以教師電腦毋須安裝任何軟件也可使用。