目前為止,我們學到了基本的for迴圈,也就是僅對一個可迭代物件進行迭代。當一個迴圈裡面還有另一個迴圈,這時就形成了巢狀迴圈,最基本的例子就是九九乘法表,每個被乘數都對應到9個乘數,當被乘數和9個乘數都計算完了之後,才換下一個被乘數,不斷迴圈直到每個被乘數和乘數都計算過。另個for迴圈的應用是將串列和for迴圈結合,使用迭代的方式生成串列(list comprehension),讓程式的可讀性更高也更精簡。
巢狀for迴圈 (Nested for loop)
巢狀for迴圈的基本語法如下:
for item1 in object1:
for item2 in object 2:
Do something to each item1 and item2
以製作一個九九乘法表當作例子,程式執行時,會先從外層迴圈取得range(1, 10)裡的第一個元素i = 1,接著進到內層迴圈,依序取得range(1, 10)裡的每一個元素,也就是j = 1到j = 9,分別執行print()裡面的內容,全部執行完畢後,才會再返回外層迴圈,取得range(1, 10)裡的第二個元素i = 2,以此類推,直到內、外層迴圈的所有元素都迭代完成。
# nested for loop
for i in range(1, 10):
for j in range (1, 10):
print("%d*%d=%-4d" % (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
4*1=4 4*2=8 4*3=12 4*4=16 4*5=20 4*6=24 4*7=28 4*8=32 4*9=36
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 5*6=30 5*7=35 5*8=40 5*9=45
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 6*7=42 6*8=48 6*9=54
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 7*8=56 7*9=63
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 8*9=72
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
break 指令
在迴圈中,有時當滿足了一些條件,我們不希望迴圈繼續執行下去,需要跳出迴圈,這時可以使用break指令,其基本流程與語法如下:
for item in object:
Do A
if condition1:
Do B
break
Do C
在以下範例,我們利用random()函數隨機生成十個0~100區間內的整數並存成串列,再經過串列的sort()方法將十個整數由大到小依序排列,並輸出大於60的整數。此例子中,由於已將串列內的整數由大到小排列,因此在for迴圈中,當if條件判斷到數字不大於60時,即可進入else區塊,執行break指令跳出迴圈。
# break
scores_list = []
for _ in range(10):
scores_list.append(random.randint(0, 100))
scores_list.sort(reverse=True)
for score in scores_list:
if score > 60:
print(score, end=" ")
else:
break
for迴圈中的底線「_」代表這裡不需要再額外增加另一個變數,for迴圈的目的只是要讓其內容重複執行十遍。執行結果因為隨機取值的關係每次會有不同,但只會印出大於60的數字:
100 97 78 74
continue 指令
在迴圈中,有時當滿足了一些條件,我們希望直接執行下一個迴圈,而不執行該次迴圈的內容,這時可以使用continue指令,其基本流程與語法如下:
for item in object:
Do A
if condition1:
Do B
continue
Do C
在這個範例我們利用if條件判斷是否為偶數,若成立則執行continue指令進入下一個迴圈,因此最後只會印出range()範圍內的奇數。
# continue
odd_list = []
for i in range(1, 10):
if i % 2 == 0:
continue
odd_list.append(i)
print(odd_list)
執行結果:
[1, 3, 5, 7, 9]
串列生成 (List comprehension)
當for迴圈、if條件和串列結合,我們可以用更簡潔的方式生成串列,例如在break指令範例的這段程式碼:
scores_list = []
for score in range(10):
scores_list.append(random.randint(0, 100))
將for迴圈和串列結合,等同於這個寫法:
scores_list = []
scores_list = [random.randint(0, 100) for _ in range(10)]
又例如在continue指令範例的這段程式碼:
odd_list = []
for i in range(1, 10):
if i % 2 == 0:
continue
odd_list.append(i)
將for迴圈、if條件和串列結合,等同於這個寫法:
odd_list = []
odd_list = [i for i in range(1, 10) if i % 2 == 1]
再進一步,我們也可將巢狀for迴圈、if條件和串列結合,例如以下這個例子,我們希望找出數字1到9內,相加等於10的組合,串列的生成可以簡單一行程式碼完成:
add_to_10 = []
add_to_10 = [[i, j] for i in range(1, 10) for j in range(1, 10) if i + j == 10]
print(add_to_10)
執行結果:
[[1, 9], [2, 8], [3, 7], [4, 6], [5, 5], [6, 4], [7, 3], [8, 2], [9, 1]]
程式範例