本篇將程式初學者所需的內容預設為顯示,若需切換請點這裡。
程式中,經常需要重複的進行某些動作,這時候,就需要用到「迴圈」。其中一種方法是 for 迴圈,通常用在重複次數確定的情況下。For 迴圈的基本語法如下:
for 變數 in 串列或其他任何一串東西: 程式敘述其中的變數,在迴圈執行時,會依照串列或其他任何一串東西當中的內容,依次的變化。例如,下面這個程式可以有規則的印出一些數字:
for i in range(10): print(i) print('-----') for i in range(1, 10): print(i) print('-----') for i in range(1, 10, 2): print(i) print('-----') for i in range(10, 1, -1): print(i)跟著迴圈跳動的變數,若沒有明確意義或者特殊用途,則習慣上會命名為 i, j, k 等等。在前述範例中,迴圈裡面的 print,會因會變數 i 的跳動,而印出不同的數字。
我們將前面的範例修改一下數字範圍,並加上一點變數,則可以從 1 加到 100:
s = 0 for i in range(1, 101): s = s + i print(s)其中的變數 s,會依次被加上 1, 2, 3, ..., 100,所以迴圈跑完以後,就可以得到 1 加到 100 的結果。記得一開始要將變數 s 初始化為 0(此動作稱為歸零),否則可能會得到不正確的結果。當然,若是利用內建指令,則可以寫成「sum(range(1, 101))」,也可以利用等差級數的公式來直接做計算。
利用迴圈自己計算階乘的方法也非常相似,但是千萬記得初始值必須設為 1,而不是上一個範例的 0。以下示範計算 10 的階乘:
s = 1 for i in range(1, 11): s = s * i print(s)Question: 如何用內建函式計算階乘?請上網搜尋之。
如果要計算比較一般化的等差級數和,則可簡單的把迴圈變數跳動的範圍,改用變數來給值或判斷。當然,也可以如最後一段,用公式計算級數和。尤其是項數多的時候,用公式計算會比迴圈來的有效率:
s = 0 a1 = 3 an = 101 d = 2 for i in range(a1, an+1, d): s = s + i print(s) n = (an - a1) / d + 1 print(n*(a1+an)/2)費氏數列也很適合用迴圈來計算,以下程式可以印出費氏數列直到第 n (n ≥ 2)項的值:
prev2 = 0 # a_{n-2} prev1 = 1 # a_{n-1} n = 10 for i in range(2, n+1): fn = prev1 + prev2 prev2 = prev1 prev1 = fn print(fn)在上述的範例中,變數變化的狀況如下表:
第幾圈 \ 哪一行 「fn = prev1 + prev2」執行前 「fn = prev1 + prev2」執行後 「prev2 = prev1」執行後 「prev1 = fn」執行後 1 (i = 2) prev2: 0
prev1: 1
fn: 尚未存在(尚未被定義)prev2: 0
prev1: 1
fn: 1prev2: 1
prev1: 1
fn: 1prev2: 1
prev1: 1
fn: 12 (i = 3) prev2: 1
prev1: 1
fn: 1prev2: 1
prev1: 1
fn: 2prev2: 1
prev1: 1
fn: 2prev2: 1
prev1: 2
fn: 23 (i = 4) prev2: 1
prev1: 2
fn: 2prev2: 1
prev1: 2
fn: 3prev2: 2
prev1: 2
fn: 3prev2: 2
prev1: 3
fn: 3...... 要使用迴圈來看過 list 的每個元素時,有以下幾種用法:
a = [3, 5, 2, 4, 1] for i in range(len(a)): print(i, a[i]) print('---------') for x in a: print(x) print('---------') for i, x in enumerate(a): print(i, x) print('---------') for i, x in enumerate(a, 10): print(i, x)要使用迴圈來看過整個 dictionary 時,則有以下幾種用法:
d = { 'AB': 'CDE', 'W': 'XYZ', 123: 456, } for k in d: print(k, d[k]) print('---------') for k in d.keys(): print(k, d[k]) print('---------') for k, v in d.items(): # 在 Python 2 是 iteritems print(k, v)當然,你也可以在迴圈中,對串列或者字典就行其他各種操作,以下示範兩個範例:
a = [9, 7, 8, 6, 0] b = [] for x in a: b.append(x ** 2) print(b) print('---------') d = {} for i, x in enumerate(a): d[x] = i print(d)迴圈跟條件判斷一樣,也可以是巢狀(一層包一層)的。以下程式使用了兩層的 for 迴圈來輸出九九乘法表:
for i in range(1, 10): for j in range(1, 10): print('{:d}*{:d}={:2d} '.format(i, j, i*j), end='') print('')這支程式的輸出為:
1*1= 1 1*2= 2 1*3= 3 1*4= 4 1*5= 5 1*6= 6 1*7= 7 1*8= 8 1*9= 9 2*1= 2 2*2= 4 2*3= 6 2*4= 8 2*5=10 2*6=12 2*7=14 2*8=16 2*9=18 3*1= 3 3*2= 6 3*3= 9 3*4=12 3*5=15 3*6=18 3*7=21 3*8=24 3*9=27 ......(以下略)Question: 上述範例中的同一被乘數會排在同一橫排。如何改成印直的,即同一被乘數排在同一直排?
另外一種迴圈是 while,使用時會給定一個條件,只要條件符合,迴圈就會一直執行,所以通常使用在不太確定重複次數的情況下。While 迴圈的語法如下:
while 條件式: 程式敘述以下程式也會印出 1 到 10,各位可以體會一下 while 與 for 的語法差異:
i = 1 while i <= 10: print(i) i = i + 1利用 while 迴圈,很適合觀察「3n+1問題」的數列。這個問題的規則是這樣的:
- 給定一正整數 n
- 當 n 是偶數時:除以 2
- 當 n 是奇數時:乘以 3 再 +1
- 最後會在 4, 2, 1 三者之間循環
所以我們可以利用 while 迴圈,加上 if 進行判斷,寫出下面的程式:
n = 13 print(n) while n != 1: if n%2 == 0: n /= 2 else: n = 3*n + 1 print(int(n))Question: 在上述範例中,如果把 n 設為 1,請問程式會如何輸出?
「break」可以跳出所在的這一層迴圈,「continue」可以繼續下一層迴圈:
print("First loop:") for i in range(1, 6): if i == 3: break print(i) print('-----') print("Second loop:") for i in range(1, 6): if i == 3: continue print(i) print('-----') print("Nested loop:") for i in range(1, 4): for j in range(1, 6): print(i, j) if i == 2: break