這裡的範例是可在 Python 3 執行的獨立小程式;輸出框是預先核對的結果。題庫作答時,請保留題目提供的 solve 與參數,使用 return 交回答案。模組章的雙檔範例會另外標明操作方式。
01|每次拿出一個元素
for item in items 每輪讓 item 取得下一個元素,再執行縮排區塊。item 是自己取的變數名,可以叫 score、fruit 或 letter。迴圈跑完才繼續下方沒有縮排的程式。
fruits = ["apple", "pear", "grape"]
for fruit in fruits:
print(f"喜歡 {fruit}")
print("全部看完")喜歡 apple 喜歡 pear 喜歡 grape 全部看完
02|range 決定哪些數字會出現
range(stop) 從 0 開始,到 stop 之前停止。range(start, stop, step) 可以指定起點和間隔,step 不能是 0。要做『1 到 5』,結尾要寫 6;使用負步長時,起點也要放在結尾的另一側。
print(list(range(4)))
print(list(range(1, 6)))
print(list(range(2, 9, 2)))
print(list(range(5, 0, -1)))[0, 1, 2, 3] [1, 2, 3, 4, 5] [2, 4, 6, 8] [5, 4, 3, 2, 1]
03|加總與計數要先準備容器
total 在迴圈之前設為 0,每輪再加上目前的值。若把 total = 0 放進迴圈,前一輪的成果就會被清掉。計數也一樣:符合條件時才加 1。
scores = [50, 80, 95]
total = 0
passed_count = 0
for score in scores:
total += score
if score >= 60:
passed_count += 1
print(total)
print(passed_count)225 2
04|篩選與轉換:建立一份新清單
想保留符合條件的元素,可以準備空清單,遇到符合的值就 append。這也能用來轉換資料。不要一邊走訪原清單、一邊刪除其中元素,否則後面的位置可能移動,造成漏掉資料。
numbers = [1, 2, 3, 4, 5]
doubled_evens = []
for number in numbers:
if number % 2 == 0:
doubled_evens.append(number * 2)
print(doubled_evens)
print(numbers)[4, 8] [1, 2, 3, 4, 5]
05|同時取得編號與資料
enumerate 會提供位置與元素,不必自己維護索引。預設位置從 0 開始;只是要顯示第幾名時,可以指定 start=1。顯示用編號與清單實際索引是兩件不同的事。
names = ["小芽", "小林", "小晴"]
for rank, name in enumerate(names, start=1):
print(rank, name)1 小芽 2 小林 3 小晴
06|continue 跳過本輪,break 結束迴圈
continue 直接開始下一輪;break 則離開目前最近的一層迴圈。先用一個清楚的小需求練習:略過負數,遇到停止符號 99 就結束,其他數字加總。
numbers = [3, -1, 5, 99, 8]
total = 0
for number in numbers:
if number == 99:
break
if number < 0:
continue
total += number
print(total)8
07|巢狀迴圈:一列一列處理
外層迴圈每前進一次,內層迴圈就從頭處理那一列。先在腦中列出每輪拿到的 row 與 value,再寫程式。資料很多時,巢狀迴圈的工作次數會增加,本課先使用小型表格。
table = [[1, 2], [3, 4], [5, 6]]
row_totals = []
for row in table:
total = 0
for value in row:
total += value
row_totals.append(total)
print(row_totals)[3, 7, 11]
WHEN SOMETHING GOES WRONG
遇到錯誤,先檢查這裡
把元素當成索引
for score in scores 拿到的是分數本身,不是位置。需要位置時使用 enumerate,或明確走訪 range(len(scores))。
return 放進迴圈,第一輪就結束
若題目要處理全部元素,通常先完成迴圈,才在迴圈外 return 結果。
以為空清單會跑一次
for 走訪空清單時一次也不執行。結果容器必須先在迴圈外初始化,才能正確處理空資料。
PAUSE AND TRY
先不要急著看別人的寫法
- 手算 range(3, 10, 2) 會產生哪些值,再執行確認。
- 把篩選範例改成保留大於 3 的值,不修改原清單。
- 處理二維清單時,total 放在外層之前或內層之前,各代表哪一種加總?
先用紙筆預測,再改動範例中的數字或文字。結果與預期不同時,找出最早開始不同的那一步。
把這幾件事帶走
- for 逐一取得元素,不一定取得索引。
- 結果容器放在適當的迴圈外面。
- 空清單、只有一個元素與剛好符合條件的值都要測。
FROM READING TO PRACTICE
用三道免費題,練習本章觀念
先做簡單題確認語法,再把幾個步驟組合起來。三題都來自本章主題的新版免費題庫,難度表示需要組合的基本概念。
延伸閱讀:Python 官方文件
以下是本章查證使用的官方資料。可以先完成入門練習,再回來查閱更完整的參數與說明。