Semorphe

for 與 range

走過一串東西,而不用自己數。 · ⏱ 約 25 分鐘

你會學到三件事

  1. for ... in 走過一串東西
  2. range() 產生一串數字
  3. for 和 while 各自什麼時候用

開始之前

上一課的迴圈,三樣東西散在三個地方,而第三樣很容易忘。

for 把它們包起來,你不可能漏掉前進。

🟢 先把編輯器打開,跟著下面一起做:跟著做

一、range

照著打上這一段:

1for i in range(1, 6):2    print(i)
16數列變數i印出對裡的每一個i12

印出 1 2 3 4 5。

⚠️ range(1, 6) 不含 6。「含頭不含尾」這個約定整個 Python 都通用。

寫法 產生
range(5) 0, 1, 2, 3, 4
range(1, 6) 1, 2, 3, 4, 5
range(0, 10, 2) 0, 2, 4, 6, 8
range(5, 0, -1) 5, 4, 3, 2, 1

只給一個數字的話從 0 開始:range(5) 是 0 到 4,剛好 5 個。

積木盤上 range 那一顆寫著「數列」。

二、累加

同樣是加總,for 寫起來是這樣:

1total = 02for i in range(1, 11):3    total = total + i4print(total)      # 55
0111數列變數total變數i+設定total為變數total印出對裡的每一個i設定total為1234

和上一課的 while 版本做同一件事,而少了一行(不用自己 n = n + 1), 也少了一個出錯的地方。

三、for vs while

什麼時候用
for 知道要跑幾次、或要走過一串現成的東西
while 不知道要跑幾次——跑到某件事發生為止

🔎 這一段是試一下——打了看結果就好,不要留在程式裡。

1for i in range(10):2while user_says_yes():
10數列呼叫user_says_yes當成立時,重複對裡的每一個i12

能用 for 就用 for。 它把「前進」寫死了,所以你不會忘記,也不會寫錯。

四、for 也可以走別的東西

for 走得過的不只數字,一段文字也可以:

🔎 這一段是試一下——打了看結果就好,不要留在程式裡。

1for c in "Python":2    print(c)
"Python"變數c印出對裡的每一個i12

一個字一個字印出來,文字本身就是一串東西。

下一課的清單也是。for ... in 走的是「任何一串東西」, 不是只有數字。

⚠️ 不要為了拿位置而寫 range(len(x)):

🔎 這一段是試一下——打了看結果就好,不要留在程式裡。

1names = ["a", "b", "c"]2for n in names:              # ✅3for i in range(len(names)):  # ⚠️ 除非你真的需要 i
"a""b""c"串列變數names變數names的長度數列對裡的每一個i對裡的每一個i設定names為123

五、break / continue 一樣能用

這兩個字在 for 裡也一樣:

1for i in range(1, 11):2    if i == 5:3        break4    print(i)
111數列變數i5=跳出迴圈變數i印出如果則對裡的每一個i1234

印 1 2 3 4 就停。和 while 完全一樣。

完成的樣子

這一課的參考做法——程式碼每一行的號碼,就印在對應的那塊積木上。

1for i in range(1, 6):2    print(i)3 4total = 05for i in range(1, 11):6    total = total + i7print(total)
16數列變數i印出0111數列變數total變數i+設定total為變數total印出對裡的每一個i設定total為對裡的每一個i124567

把積木打散,自己排回去:排回去:把剛才那支程式的積木排好

換你了

用巢狀 for 印出九九乘法表的前三列。

⚠️ 提示:外圈走列、內圈走行;print(i * j, end=" ") 不換行, 一列跑完再 print() 換一行。

到編輯器做這一題:練習:九九乘法表的前三列

做一個

數出 2 到 100 之間有幾個質數(只能被 1 和自己整除)。

🔴 這一題需要一個迴圈套在另一個迴圈裡:外圈走每個數,內圈試除。 做完想一下:內圈真的要試到 n 嗎?試到哪裡就夠了?

到編輯器做這一題:做一個:100 以內有幾個質數

這一課你做了什麼

如果卡住了

你看到 多半是因為
少印一個數字 range(n) 不含 n。要含就 range(n + 1)
range 印出 range(0, 5) 它是一個產生器。要看內容用 list(range(5))
巢狀迴圈全擠一行 print() 換行那一行位置不對
迴圈變數在外面用不到 for 的變數在迴圈結束後還在,而值是最後一次的
在編輯器打開這一課 →