【Python基礎教學】迴圈【part-7】 === 目錄(Table of Contents) [TOC] --- 哈囉大家好,很感謝你點進本文章,我是一名高中生,是電腦社社團的社長,由於我並不是 Python 這方面非常精通的專家,所以若文章有些錯誤請見諒,也可向我指正錯誤。另外本文章的用意是作為電腦社社團的教材使用而編寫的。 接下來,讓我們進入正題。 之前我們說到字典時,講到他內建的方法(method),那麼方法跟函數有什麼差別呢?我們看以下圖表便知: ![image](https://hackmd.io/_uploads/SypwF0KpT.png) 圖源:[類別方法 (Method) VS. 函數 (Function) - Vinci AI 蘊思智能](https://vinciai.academy/method-vs-function/) 我們看到定義的部分,前面我們都說物件(object),而在這裡卻說對象,不過按照英文翻譯解釋,object 也有對象的意思,所以各位不用對此感到任何疑慮。 接下來看基本句法的部分,method 的部分上面還多了一個 class,這我們稱為「類別」,它像是一個模板,能夠產出相似特性的物件,不過我們今天不會介紹到這個部分,挪移到之後再說。 接下來,讓我們進入只要是程式語言,最至關重要,非常非常重要的語法:迴圈。 迴圈(loop) --- 迴圈,不只 Python,是程式語言中最重要的核心,它能夠重複處理數據資料,以及重複處理判斷邏輯等等。而在 Python 當中,具有 for、while 兩種形式的迴圈,接下來逐步教給各位這些東西,以及告訴你這東西到底有多好用。 ### while 迴圈 --- Python 中 while 語句的一般形式長這樣: ```python= while (condition): (statements)…… ``` ![image](https://hackmd.io/_uploads/rJIZgg5pp.png) 圖源:[Python While Loop - GeeksforGeeks](https://www.geeksforgeeks.org/python-while-loop/) 然後以下是 while 迴圈的 gif 動畫圖: ![while](https://hackmd.io/_uploads/B1VVZgcpT.gif) 圖源:[Loop Animated Gifs in Python | Penjee, Learn to Code](https://blog.penjee.com/top-5-animated-gifs-explain-loops-python/) 迴圈的英文名為 loop,其意指循環,也就是說它能夠透過不斷循環及條件的控制,來替人類達成一些高重複性的動作及工作。 我們可以從上面這個 gif 看出,首先宣告變數 a = 1,之後第二行進入到 while 迴圈裡面,它設下的條件(if)a 要小於 10,所以說如果 a > 10,那麼它將離開這個迴圈。 而在第三行,它可以印出 a 的值,且放置在相加之前,而從右邊的 Output,能夠看出這原來是一個算奇數的程式。 如果我們將第三行跟第四行對調,那麼結果又會不一樣了,結果如下所示: ```python= 3 5 7 9 11 ``` 它就會直接跳過 1,從第二項開始,有沒有感覺像是等差數列呢?是的,沒錯,如果按照這樣的寫法,那麼它就是等差數列。 好,我們將重點拉回到程式語言的部分,while 迴圈在 Python 中,我們同樣要注意冒號跟縮排的細節。 一定要記得當我們寫 while 語句時,最後面加上一個冒號,而 statements,也就是(敘述)代碼區塊的地方,要記得縮排。 接下來,讓我們做一個等差級數 1 加到 100 的範例: ```python= n = 100 sum = 0 counter = 1 while counter <= n: sum = sum + counter counter += 1 print("1 到 %d 之和為: %d" % (n,sum)) ``` 輸出結果: `1 到 100 之和為: 5050` :::success 這樣理解就懂! while 迴圈是帶有條件的迴圈,while 要不斷執行到條件不成立為止才停! ::: ### 無限循環 --- 無限循環其實很簡單,我們只要讓條件永遠為 True,就能達到無限循環的結果,如下所示: ```python= i=0 while True: print(i) i+=2 ``` 那麼這支程式就會不斷循環下去,問題來了,這該要怎麼停止循環呢?很簡單,我們只要按下 ctrl + C 就能中斷這個無限迴圈。 ### while 迴圈、else 語句 --- 語法如下所示: ```python= while <expr>: <statement(s)> else: <additional_statement(s)> ``` > expr 條件語句為 true 則執行 statement(s) 語句區塊,如果為 false,則執行 additional_statement(s)。 以下是迴圈輸出數字,並判斷大小的程式: ```python= count = 0 while count < 5: print (count, " 小於 5") count = count + 1 else: print (count, " 大於或等於 5") ``` ```python= 0 小於 5 1 小於 5 2 小於 5 3 小於 5 4 小於 5 5 大於或等於 5 ``` 那如果你的 while 語句裡頭 statement 只有一行,那麼可以與 while 語句並行寫,如: `while True: print("Hello World!")` :::success 這樣理解就懂! while 與 else 語句的結合,簡單來講就是:條件成立(True)執行 while 底下內容,條件不成立(False)執行 else 底下內容。 ::: ### for 迴圈 --- Python 的 for 迴圈可以遍歷任何可迭代物件(序列:sequence),如一個列表或一個字串。 ```python= for <variable> in <sequence>: <statements> else: <statements> ``` 問題來了,請問遍歷(traversal)、迭代(iteration)是什麼呢? 遍歷從中文意思來看,是都走過一遍的意思,你從英文意思也可以看得出來。在這邊,假設有一個列表長這樣:s = [1,2,3,4,5,6,7,8,9] 而遍歷的意思就是從這個列表的第一個元素 s[0],一直走到 s[8] 最後一個元素,所以他就會走 1~9 這些數字。 > 迭代(iteration)是程式中對一組指令(或一定步驟)的重複。它既可以被用作通用的術語(與「重複」同義),也可以用來描述一種特定形式的具有可變狀態的重複。 :::success 迭代(iteration)就是重複執行的意思。 ::: ```python= a = 0 for i in range(1,10): a+=i print(a) ``` 輸出結果: ```python= 1 3 6 10 15 21 28 36 45 ``` 在上述代碼中,其實它本體就是一個迭代,迭代時常與遞迴(recursive:在自己的函數裡面呼叫自己的函數)拿來做比較,不過我們今天不會講太細,遞迴之後再說,目前主要先著重在實際應用上面。 繼續講解迭代之前,我們先來說明一下 range() 這個函數,目前可以看到我們在上述代碼 range() 函數的括號裡面寫 1,10,代表會從 1 遍歷到 9,也就是 1 2 3 4 5 6 7 8 9 跑一遍,並且賦值給 for 迴圈的那個 i。 而當下面代碼的 statement 執行完一遍後,再跳回到 for 迴圈,i = 2,依此類推。 我們可以做這樣的理解:i 代表迴圈所要重複的變數,而 range() 設置 i 要重複的次數範圍。 以下是 range() 語法: `range(start, end [, step])` 我們 range(10) 這樣寫,就等於 range(0, 10),只寫一個引數(Argument)起始默認值為 0。 range(1, 10),設定起始值為 1,然後最後一項沒有 10。-> 把 1 想成是等差數列中的第一項之值,然後把 10 想成是等差數列的最後一項之值,然後減 1。 range(1, 10, 2),最後一個引數代表我們等差數列的公差(d:Common Difference),所以執行結果就會變這樣: ```python= 1 3 5 7 9 ``` > 而 range() 在 Python for 迴圈的定義中,是可以迭代的物件,它的型態是物件,而不是列表,所以印出時不會是列表的形式。 ```python= a = 0 for i in range(1,10): a+=i print(a) ``` 另外想知道遞迴與迭代的區別,請至此網站(課後補充):[【第十二天 - 遞迴介紹】 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天](https://ithelp.ithome.com.tw/articles/10263011) 接下來我們來做幾題練習題: ```python= for i in range(1,5): print(i) ``` ```python= for i in range(10,0,-1): print(i) ``` ```python= for i in range(1,10): print(i*i) ``` :::success range(10) -> 表示遍歷從 0 ~ 9 的範圍。等同於 range(0, 10) range(1, 10) -> 表示遍歷從 1 ~ 9 的範圍。 range(10, -1, -1) -> 將公差設為 -1,表示將遍歷從 10 ~ 0 的範圍。(這個 -1 的意思可能有點難轉過來,其實是 1 - 1 = 0,最後遍歷的數字會是 0) ::: ### for-else 語句 --- > 在 Python 中,for...else 語句用於在迴圈結束後執行一段程式碼。 ```python= for item in iterable: # 迴圈主體 else: # 迴圈結束後執行這裡 ``` > 當迴圈執行完畢(即遍歷 iterable 中的所有元素)後,會執行 else 子句中的程式碼,如果在迴圈過程中遇到了 break 語句,則會中斷迴圈,此時不會執行 else 子句。 以下是 for-else 語句: ```python= for x in range(6): print(x) else: print("Finally finished!") ``` 這可以應用在安裝程式上面的進度條,當我們進度條跑完時,會跳出一個結束畫面,for-else 的功用就在這裡。 接下來是 for-else 配上 break 語句: ```python= sites = ["Yahoo", "Google", "Youtube", "Bing"] for site in sites: if site == "Youtube": print("Youtube!") break print("迴圈數據: " + site) else: print("沒有迴圈數據!") print("完成迴圈!") ``` 輸出結果: ```python= 迴圈數據: Yahoo 迴圈數據: Google Youtube! 完成迴圈! ``` ### for 巢狀迴圈 --- 如同巢狀條件式一樣,for 巢狀迴圈語法如下所示: ```python= for i in range(10): for i in range(10): print(i) ``` 首先,第一行我們遍歷 0 ~ 9,也就是說接下來裡面的程式碼會執行十次。 然後看到下兩行,同樣是遍歷 0 ~ 9,只是這次會輸出 0 ~ 9 的數字。 這什麼意思呢?也就是說我們會「輸出 0~9 的數字總共十次」。 我們在第一行下面加一個 print("") 比較容易看得清楚這個結果。 ```python= for i in range(2): print("") for i in range(2): print(i) ``` 註:由於避免輸出結果太過冗長,所以將 10 次改為 2。 輸出結果: ```python= 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 ``` 可以看到巢狀迴圈使 0 ~ 9 數字遍歷兩次,這就是巢狀迴圈。 ### break / continue --- 當我們在操作迴圈時,可以使用 break、continue 指令來停止迴圈,break 與 continue 的差別在於: break: 停止目前迴圈,迴圈後面所有尚未遍歷及迭代完的都結束工作,直接跳出迴圈本身。 continue: 停止這一次的迴圈,回到迴圈開頭繼續遍歷跟迭代。 ![image](https://hackmd.io/_uploads/Hk7fX2cTp.png) 圖源:[重複迴圈 ( for、while ) - Python 教學 | STEAM 教育學習網](https://steam.oxxostudio.tw/category/python/basic/loop.html#google_vignette) 以下是一個簡單的 break 範例: ```python= for i in range(10): if i == 5: break print("i 的數值是: ",i) ``` 輸出結果: ```python= i 的數值是: 5 ``` 藉由上述代碼及輸出結果可以看到,i 的數值只有到 5,而不是 9。 以及一個簡單的 continue 範例: ```python= for i in range(10): if i == 1 or i == 2 or i == 3: continue print(i) ``` 輸出結果: ```python= 0 4 5 6 7 8 9 ``` 藉由上述代碼及輸出結果可以看到,1 2 3 直接被跳過,但後續工作仍繼續進行著。 APCS b964. 1. 成績指標 --- 考題內容:[APCS 201603-1 成績指標.pdf](https://drive.google.com/file/d/1-Xeo4uGQ7dPYtfpZmlTnBXKIstJgjuKD/view) Zerojudge:[b964. 1. 成績指標 - 高中生程式解題系統](https://zerojudge.tw/ShowProblem?problemid=b964) ### 解題思路 --- 解 APCS 題目時,第一步絕對要先看輸入內容,另外在 input() 的部分,裡面通常是不寫提示的,如:「請輸入學生人數:」等等,因為沒有必要。 第二行需要輸入學生成績,我們可以用列表推導式直接實作: `score = [int(i) for i in input().split()]` 直接用一行代碼省去繁瑣的步驟,這以後會教到,除了列表推導式也會有元組推導式、集合推導式等等。 接下來第三行我們直接用 Python 內建方法進行排序,這樣寫:score.sort()。 之後的印出可以運用到我們之前學過的 " ".join() 指令,需要注意的是,這個方法必須用於 string 上,所以你需要想想看怎麼將整數列表轉換成 string。 接下來輸出的部分,條件說到,如果全數及格、全數不及格,這兩個可以只判斷列表頭尾就行了。 先判斷全數及格、全數不及格,之後我們再來判斷最高不及格分數跟最低及格分數。 在判斷最高不及格分數時,我們可以利用今天所學的 for 迴圈,利用負公差 = -1,從尾到頭遍歷判斷。 接下來最低及格分數就反著做,然後就完成了。 總結 --- ### while 迴圈 --- 兩種形式: ```python= while (condition): (statements)…… ``` ```python= while <expr>: <statement(s)> else: <additional_statement(s)> ``` 無限迴圈形式: ```python= while True: # execute forever ``` :::success while 迴圈就是帶有條件的迴圈,條件成立(即 True)才會執行內容,直到條件不成立(即 False)。 else 的功用在於條件不成立時所要執行的內容。 ::: ### for 迴圈 --- 兩種形式: ```python= for <variable> in <sequence>: <statements> else: <statements> ``` ```python= for item in iterable: # 迴圈主體 else: # 迴圈結束後執行這裡 ``` sequence -> 序列,意即列表、元組、range() 函數。是要被用來迭代(重複執行)的物件。 而 for 跟 in 中間的 variable 則是要被迭代的變數,通常用 i、j 表示。 ### 巢狀迴圈 --- 巢狀迴圈是最常應用到的語法,如下: ```python= for i in range(1, 10): for j in range(1, 10): print(i, j) ``` 這是雙層迴圈的結構,表示每次 i 增加 1 時,j 就會執行 9 次,故執行次數 = 9 * 9 = 81。 具體應用會將 range() 中數字取代為變數,做更進一步的運算,如:矩陣運算(高二下數學A可學到)。 ### break / continue --- break -> 表示中斷迴圈的執行,不會再繼續執行迴圈,而是繼續往下執行代碼。 continue -> 表示中斷迴圈執行,但是繼續下一次的迴圈。 好啦,那以上就是今天的教學了,以下是一些參考資料: 參考資料 === [類別方法 (Method) VS. 函數 (Function) - Vinci AI 蘊思智能](https://vinciai.academy/method-vs-function/) [Python While Loop - GeeksforGeeks](https://www.geeksforgeeks.org/python-while-loop/) [Loop Animated Gifs in Python | Penjee, Learn to Code](https://blog.penjee.com/top-5-animated-gifs-explain-loops-python/) [【第十二天 - 遞迴介紹】 - iT 邦幫忙::一起幫忙解決難題,拯救 IT 人的一天](https://ithelp.ithome.com.tw/articles/10263011) [迭代 - 維基百科,自由的百科全書](https://zh.wikipedia.org/zh-tw/%E8%BF%AD%E4%BB%A3#%E5%9C%A8%E9%9B%BB%E8%85%A6%E4%B8%AD) [遞迴 VS 迭代 - HackMD](https://hackmd.io/@PythonTutor/By9P6avKd) [Python range() 函數 | 菜鳥教程](https://www.runoob.com/python/python-func-range.html) [重複迴圈 ( for、while ) - Python 教學 | STEAM 教育學習網](https://steam.oxxostudio.tw/category/python/basic/loop.html#google_vignette) [Python3 循環語句 | 菜鳥教程](https://www.runoob.com/python3/python3-loop.html)