---
# System prepended metadata

title: 【Python基礎教學】迴圈【part-7】
tags: [Python, 程式語言]

---

【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)