本篇將程式初學者所需的內容預設為顯示,若需切換請點這裡

程式中,經常需要重複的進行某些動作,這時候,就需要用到「迴圈」。其中一種方法是 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)項的值:

prev1 = 1
prev2 = 0
n = 7
for i in range(2, n+1):
	fn = prev1 + prev2
	prev2 = prev1
	prev1 = fn
print(fn)

要使用迴圈來看過 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問題」的數列。這個問題的規則是這樣的:

所以我們可以利用 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