KT 的 Python 進階程式設計

W03|讓程式重複嘗試:for迴圈、篩選與窮舉

今天完成後,我可以

  1. 使用 for 與 range() 讓程式依序處理一段整數。
  2. 知道 range() 包含開始值,但不包含結束界線。
  3. 把 if 放入迴圈,只處理符合條件的數字。
  4. 使用窮舉法逐一嘗試所有可能,找出符合條件的答案。
  5. 看懂「同一行輸入兩個整數」的基本寫法。

一、快速恢復 for 與 range()

先不要執行,預測下面的程式會輸出什麼:

Python 3圖片
資料/示意
第1個輸出:____
最後一個輸出:____
一共輸出:____個數字

range(1, 6)包含 1,但不包含 6。

語法示意圖片

如果省略「每次增加量」,預設每次增加 1。

二、課中練習

2-1|b032 小朋友學數數(30分)

題目依序輸入開始值、結束值與間隔值。輸出從開始值到結束值(包含兩者)的所有數字,每次增加指定間隔,每個數字各占一行。題目保證「結束值-開始值」可被間隔值整除。

動手前先回答

若輸入為:

資料/示意
11
31
4
  1. 第一個輸出是多少?
  2. 第二個輸出是多少?
  3. 最後一個輸出是多少?
  4. 一共會輸出幾個數字?
提示一:怎樣讓range()包含結束值?

range()不包含結束界線。把結束界線寫成end + 1,就能讓本題保證會走到的end也被包含在範圍內。

提示二:程式骨架
Python 3圖片

進入第二題前:把條件判斷放入迴圈

迴圈可以依序產生很多數字,if可以從中挑出符合條件的數字。例如,只輸出1到10之間的偶數:

Python 3圖片

閱讀時可以分成兩個問題:

  1. for:現在要檢查哪些可能?
  2. if:目前這個可能符合條件嗎?

2-2|b016 雞兔同籠(70分)

已知雞兔的總隻數與總腳數,請找出雞和兔各有幾隻。

答案要在同一行輸出雞、兔兩個數字,並以空白分隔;忘記寫法時可查閱輸入輸出技巧|同一行使用空白分隔。

這次不使用聯立方程式直接推導,而是讓電腦把每一種可能依序試過一次。這種方法稱為「窮舉」。

先用小資料實際嘗試

假設共有 5 隻動物、14 隻腳:

表格可左右滑動
雞 兔 總隻數 算出的總腳數 符合嗎?
0 5 5 20 否
1 4 5 __ __
2 3 5 __ __
3 2 5 __ __
4 1 5 __ __
5 0 5 10 否

窮舉的步驟

思考步驟
讓雞從0隻開始逐一嘗試
→ 兔子隻數 = 總隻數 - 雞隻數
→ 算出目前組合的總腳數
→ 若腳數符合,就輸出雞與兔的隻數
提示一:要嘗試到哪裡?

別忘了「全部都是兔子」和「全部都是雞」也可能是答案,因此雞可能是 0 到總隻數。

提示二:窮舉骨架
Python 3圖片

三、課後挑戰:從篩選走向計數與加總

時間不夠時,建議依序完成b017 → a034 → a036,最後再挑戰b018;這樣能先準備好下週會用到的計數與加總。

表格可左右滑動
題目 配分 定位 本週目標
b017 找因數 15 分 基礎必做 逐一檢查並輸出符合條件的數字
b018 韓信點兵 20 分 核心練習 同時檢查三個取餘數條件
a034 我愛偶數 25 分 自學:計數 每找到一個偶數,就把數量加一
a036 我也愛偶數 40 分 自學:加總 每找到一個偶數,就把它加入總和

3-1|b017 找因數

從 1 到 n逐一檢查。如果 n除以目前數字的餘數是 0,目前數字就是因數。

思考步驟
逐一產生可能的因數
→ 用 % 檢查餘數
→ 符合時才輸出

3-2|b018 韓信點兵

題目給定最少人數與最多人數,請逐一檢查範圍內的每個人數。三個餘數條件必須同時成立,可以使用 and連接。

提示:先分別寫出三個條件
資料/示意
除以3餘2
除以5餘3
除以7餘2

把三個條件分別翻譯成 Python,再用 and連接。

課後共用工具:同一行輸入兩個整數

a034和a036的兩個整數寫在同一行,中間以空白分隔,例如:

資料/示意
2 10

不要執行兩次 input()。請依照「讀入、切開、轉型」三個步驟:

Python 3圖片

資料的變化如下:

思考步驟
讀入 "2 10"
→ split()切成 "2" 與 "10"
→ int()轉成整數2與整數10

精簡寫法等之後熟悉資料轉換再學,本週先使用上面的基本寫法。

3-3|a034 我愛偶數——計數

題目不是要輸出每一個偶數,而是要回答「一共有幾個」。因此要準備一個變數保存目前找到的數量。

思考步驟
數量一開始是0
→ 逐一檢查a到b的每個整數
→ 找到偶數時,數量增加1
→ 全部檢查完成後,輸出數量
提示:計數骨架
Python 3圖片

本週使用迴圈解題,得到90分就代表已達成計數練習目標。最後一筆測資會顯示TLE(執行超時),這是預期中的結果。剩下的10分需要用數學方法避開很長的迴圈,現在不必先學。

3-4|a036 我也愛偶數——加總

這次不是數「有幾個偶數」,而是把找到的偶數加起來。

請先比較:

表格可左右滑動
任務 變數起始值 找到偶數時
計數 count = 0 把 count增加 1
加總 total = 0 把 number加入 total
提示:從計數程式修改

保留 a034的輸入、迴圈與偶數判斷,只修改:

  1. 用哪個變數保存答案。
  2. 找到偶數時,要加上 1還是加上目前的 number。
  3. 最後要輸出哪個變數。

四、完成後自我檢查