CodeSprout程式萌芽

CHAPTER 04 · PYTHON FOUNDATIONS

For Loop (迴圈)

逐一處理清單、文字與數字範圍,把重複工作交給程式。

這一章學會
  • 讀懂 for 迴圈每輪的值
  • 正確使用 range 與 enumerate
  • 完成加總、篩選、計數與基本巢狀迴圈
先預測結果,再看輸出。

這裡的範例是可在 Python 3 執行的獨立小程式;輸出框是預先核對的結果。題庫作答時,請保留題目提供的 solve 與參數,使用 return 交回答案。模組章的雙檔範例會另外標明操作方式。

01|每次拿出一個元素

for item in items 每輪讓 item 取得下一個元素,再執行縮排區塊。item 是自己取的變數名,可以叫 score、fruit 或 letter。迴圈跑完才繼續下方沒有縮排的程式。

PYTHON程式碼
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;使用負步長時,起點也要放在結尾的另一側。

PYTHON程式碼
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。

PYTHON程式碼
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。這也能用來轉換資料。不要一邊走訪原清單、一邊刪除其中元素,否則後面的位置可能移動,造成漏掉資料。

PYTHON程式碼
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。顯示用編號與清單實際索引是兩件不同的事。

PYTHON程式碼
names = ["小芽", "小林", "小晴"]
for rank, name in enumerate(names, start=1):
    print(rank, name)
預期輸出
1 小芽
2 小林
3 小晴

06|continue 跳過本輪,break 結束迴圈

continue 直接開始下一輪;break 則離開目前最近的一層迴圈。先用一個清楚的小需求練習:略過負數,遇到停止符號 99 就結束,其他數字加總。

PYTHON程式碼
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,再寫程式。資料很多時,巢狀迴圈的工作次數會增加,本課先使用小型表格。

PYTHON程式碼
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

先不要急著看別人的寫法

  1. 手算 range(3, 10, 2) 會產生哪些值,再執行確認。
  2. 把篩選範例改成保留大於 3 的值,不修改原清單。
  3. 處理二維清單時,total 放在外層之前或內層之前,各代表哪一種加總?

先用紙筆預測,再改動範例中的數字或文字。結果與預期不同時,找出最早開始不同的那一步。

把這幾件事帶走

  • for 逐一取得元素,不一定取得索引。
  • 結果容器放在適當的迴圈外面。
  • 空清單、只有一個元素與剛好符合條件的值都要測。

FROM READING TO PRACTICE

用三道免費題,練習本章觀念

先做簡單題確認語法,再把幾個步驟組合起來。三題都來自本章主題的新版免費題庫,難度表示需要組合的基本概念。

延伸閱讀:Python 官方文件

以下是本章查證使用的官方資料。可以先完成入門練習,再回來查閱更完整的參數與說明。