迴圈

Python 程式設計:深入解析「迴圈結構」 (for, while)

1. 什麼是迴圈?為什麼需要它?

想像一下,你需要列印出 1 到 100 的所有數字。如果沒有迴圈,你可能需要寫 100 次的 print() 指令,這顯然非常沒有效率。迴圈(Loop) 的目的就是為了解決這類重複性的工作。

在 Python 中,主要有兩種迴圈結構:

  • for 迴圈:用來遍歷集合物件中的第一個至最後一個元素。搭配 range 物件,可以遍歷固定間隔值的整數。
  • Python 中有許多集合物件。例:str, list, set, tupple, map, range ...
  • while 迴圈:只要指定的值為 True,就持續執行。

2. for 迴圈:遍歷指定的集合物件

for 迴圈的核心概念是「複製出集合物件中的每一個元素來做指定的運算」。

語法樣式
for 變數 in 集合物件:
	程式區塊範圍內,集合物件中的每一個元素,會從第一個至最後一個依序複製給變數

2.1 for 迴圈的常見用法

2.1.1 遍歷字串物件(str)

message = "Python"

for i in message:
    print(i, sep="-")

# 輸出:
# P-y-t-h-o-n

2.1.2 使用 range() 函數建立 range 物件

當你需要一群固定間隔的整數時,range() 是你最好的朋友。它會產生一個不可變的數字集合,非常節省記憶體。

range() 主要有三種呼叫方式:

  • range(stop)

    指派一個大於 0 的正整數給 stop,環境會建立一個 range 物件。物件中會包含從 0 開始,直到 stop - 1 的連續整數。

    # 產生 0, 1, 2, 3, 4
    for i in range(5):
        print(i, end=' ') # 輸出: 0 1 2 3 4 
  • range(start, stop)

    指派兩個整數給 startstop ,正負值均可,但 start 必須小於 stop,環境會建立一個 range 物件。物件中會包含從 start 開始,直到 stop - 1 的連續整數。

    # 產生 2, 3, 4, 5
    for i in range(2, 6):
        print(i, end=' ') # 輸出: 2 3 4 5 
    # 產生 -5, -4, -3, -2
    for i in range(-5, -1):
        print(i, end=' ') # 輸出: -5 -4 -3 -2 
  • range(start, stop, step)

    指派兩個整數給 startstop ,正負值均可。但如果 start 小於 stop,就必須指派一個正值給 step,環境會建立一個 range 物件。物件中會包含從 start 開始,直到 stop - 1 間隔為 step 的整數。如果 start 大於 stop,就必須指派一個負值給 step,環境會建立一個 range 物件。物件中會包含從 start 開始,直到 stop + 1 間隔為 step 的整數。

    # 印出 1 到 10 之間的所有奇數 (間隔值為 2)
    for i in range(1, 11, 2):
        print(i, end=' ') # 輸出: 1 3 5 7 9
    
    # 從 5 倒數到 1 (間隔值為 -1)
    for i in range(5, 0, -1):
        print(i, end=' ') # 輸出: 5 4 3 2 1

練習 2.1.2.01 數字總和

給定 1 個大於 0 的正整數,運算出從 1 至該整數(含)之間所有數字的和並輸出

例 1
輸入:
10
輸出:
55

例 2
輸入:
100
輸出:
5050

例 3
輸入:
1000
輸出:
500500

練習 2.1.2.02 乘方值

給定 2 個大於等於 0 的正整數。假設為 a, b。
運算出 a 的 b 次方的值並輸出。

例 1
輸入:
2 5
輸出:
32
說明:
2 的 5 次方值為 32。


例 2
輸入:
3 0
輸出:
1

例 3
輸入:
0 5
輸出:
0

練習 2.1.2.03 奇數和與偶數和的差的絶對值

給定 1 個大於 0 的正整數。
分別運算出從 1 至該整數(含/若該整數為奇數)之間所有奇數的和
與從 2 至該整數(含/若該整數為偶數)之間所有偶數的和,
再運算出這兩個和的差的絶對值並輸出。

例 1
輸入:
5
輸出:
3
說明:
奇數=>1 3 5->9
偶數=>2 4->6
9-6 = 3


例 2
輸入:
8
輸出:
4
奇數=>1 3 5 7->16
偶數=>2 4 6 8->20
20-16=4


例 3
輸入:
123
輸出:
61

練習 2.1.2.04 列印5的倍數

給定 2 個整數假設為 m, n ,m 不一定小於 n。
請由小到大,列印出 m 與 n 之間的所有 5 的倍數(含/若 m 或 n 為 5 的倍數)。
輸出的數字若一個以上用空格間隔。
若沒有數字可以輸出時,輸出 None.


例 1
輸入:
2 15
輸出:
5 10 15

例 2
輸入:
13 2
輸出:
5 10

例 3
輸入:
5 20
輸出:
5 10 15 20

例 4
輸入:
5 5
輸出:
5

例 5
輸入:
6 9
輸出:
None

練習 2.1.2.05 有幾個因數

給定 1 個正整數。輸出該整數有幾個因數。


例 1
輸入:
2
輸出:
2
說明: 1 2

例 2
輸入:
6
輸出:
4
說明: 1 2 3 6

例 3
輸入:
7
輸出:
2

例 4
輸入:
32
輸出:
6

2.1.3 巢狀迴圈 (Nested Loops)

範例: 列印九九乘法表

for i in range(1, 10):      # 控制第一個數字 (從 1 到 9)
    for j in range(1, 10):  # 控制第二個數字 (從 1 到 9)
        print(i, "*", j, "=", i*j, sep ="", end="\t")
    print() # 換行

3. while

while 迴圈會不斷地執行,直到它的值為False時停止。

語法樣式:
while 布林值:
	要重複執行的程式碼
注意: while 迴圈的區塊內必須有能改變值的程式碼,否則會變成無窮迴圈!

3.1.1 以計數器為條件的迴圈

count = 0
while count < 5:
    print(count)
    count += 1 # 這是改變條件的關鍵

3.1.2 非以計數器為條件的迴圈

command = ""
while command.lower() != "quit":
    command = input("請輸入指令 (輸入 'quit' 結束): ")
    if command.lower() != "quit":
        print(f"你輸入了: {command}")

print("程式結束。")

練習 3.1.2.01 2 的幾次方(2為底數的對數)

給定 1 個大於等於 1 的正整數,而且一定是 2 的某一個次方的值。
請運算並輸出它是 2 的幾次方。

例 
輸入:
16
輸出:
4

例 
輸入:
256
輸出:
8

例 
輸入:
1
輸出:
0

4. 迴圈控制敍述

有時候我們需要在迴圈執行到一半時改變它的正常流程。

4.1 break:立即終止迴圈

break 會完全跳出當前所在的迴圈。

numbers = [10, 25, 30, -5, 40, -12]
for num in numbers:
    print(f"正在檢查: {num}")
    if num < 0:
        print(f"找到了第一個負數: {num}")
        break # 找到了,跳出迴圈

4.2 continue:跳過本次,進入下次

continue 會立即結束本次迭代,直接開始下一次迭代。

numbers = [10, -2, 5, -8, 20]
total = 0
for num in numbers:
    if num < 0:
        continue # 如果是負數,跳過本次,檢查下一個
    total += num
print(f"正數的總和是: {total}") # 輸出: 35

4.3 else 子句 in Loops

當迴圈正常結束(沒有被 break 中斷)時,else 區塊會被執行。

範例: 檢查一個數字是否為質數。

num_to_check = 13
for i in range(2, num_to_check):
    if num_to_check % i == 0:
        print(f"{num_to_check} 不是質數,可被 {i} 整除。")
        break
else:
    # 如果 for 迴圈從未被 break
    print(f"{num_to_check} 是質數。")

5. 總結:for vs while

特性for 迴圈while 迴圈
核心概念遍歷 (Iteration)條件 (Condition)
適用時機已知要重複的確切次數,或處理序列中的每一個元素。不知道要重複幾次,只知道停止的條件
常見範例處理串列、執行 n 次任務。使用者輸入驗證、遊戲主迴圈。
潛在風險(較少)容易造成無窮迴圈

留言

這個網誌中的熱門文章

目錄

Python IDLE 安裝與使用

Python 核心資料型態:數字、文字與邏輯