跳到內容

迴圈敘述

要讓程式重複做同一件事,總不能一直複製貼上。這一章的迴圈就是拿來重複的:Python 有兩種迴圈,forwhile

for 會走過一連串東西,每繞一圈拿出其中一個。最常見的搭配是 range(),它會產生一串數字。range(5) 是從 0 到 4(注意,是到 5 的前一個為止,不包含 5):

for i in range(5):
print(i)

一直按「下一步」,注意變數 i 每繞一圈就換成下一個數字,for 那一行也被一再走過。

range() 有三種寫法:

  • range(結束):從 0 開始,到「結束」的前一個為止。
  • range(開始, 結束):從「開始」到「結束」的前一個。
  • range(開始, 結束, 間隔):每次跳「間隔」這麼多。
for i in range(2, 11, 2):
print(i)

range(2, 11, 2) 就是從 2 開始、每次加 2、到 11 之前為止,也就是 2、4、6、8、10。

除了數字,for 也能直接走過一個串列,每圈拿出裡面的一個元素:

fruits = ["蘋果", "香蕉", "橘子"]
for fruit in fruits:
print(fruit)

如果走串列時還想要一個「第幾個」的編號,用 enumerate():它每圈同時給你編號和元素。加上第二個參數 1,編號就從 1 開始數(不寫則從 0 開始):

fruits = ["蘋果", "香蕉", "橘子"]
for i, fruit in enumerate(fruits, 1):
print(i, fruit)

迴圈很常搭配一個變數來累加。先把總和設成 0,每繞一圈就加一個數上去:

total = 0
for i in range(1, 11):
total = total + i
print(total)

range(1, 11) 是 1 到 10,全部加起來會得到 55。這種「準備一個變數、在迴圈裡一次一次累加」的寫法,之後會一直用到。

把字串乘上一個數字,會得到重複那麼多次的字串,例如 "*" * 3"***"。搭配迴圈,每圈的重複次數不一樣,就能畫出圖形。這類「星號三角形」是很常見的練習:

for i in range(1, 6):
print("*" * i)

i 圈印 i 個星號,所以印出一個一行比一行長的三角形。

while 不數次數,而是只要條件還成立就一直重複。下面這段從 5 倒數,每圈把 count 減 1,等 count 不再大於 0 就停:

count = 5
while count > 0:
print(count)
count = count - 1
print("發射!")

while 一定要確認條件有機會變成不成立(這裡靠 count = count - 1),不然它會一直跑下去,變成無窮迴圈。

當你事先不知道要跑幾圈時,while 特別好用。下面這段會一直讀數字、加總,直到使用者輸入 0 為止。按「執行」,依序輸入幾個數字,最後輸入 0 結束:

total = 0
number = int(input("輸入一個數字,輸入 0 結束:"))
while number != 0:
total = total + number
number = int(input("再輸入一個,輸入 0 結束:"))
print("總和是", total)

你可能會在考題或別人的程式裡看到一種更精簡的寫法,用 :=(叫做「海象運算子」,Python 3.8 才加進來)把「讀輸入」和「判斷」合併在 while 那一行:

total = 0
while (n := int(input("輸入數字,輸入 0 結束:"))) != 0:
total = total + n
print("總和是", total)

(n := int(input(...))) 的意思是「把讀到的值存進 n,同時把這個值拿去比較」。它比上面分成兩行的寫法短,但也比較不好一眼看懂。看得懂就好,剛開始學建議還是用上面那種清楚的寫法。