for 與 range
走過一串東西,而不用自己數。 · ⏱ 約 25 分鐘
你會學到三件事
for ... in 走過一串東西
range() 產生一串數字
for 和 while 各自什麼時候用
開始之前
上一課的迴圈,三樣東西散在三個地方,而第三樣很容易忘。
for 把它們包起來,你不可能漏掉前進。
🟢 先把編輯器打開,跟著下面一起做:跟著做
一、range
照著打上這一段:
1for i in range(1, 6):2 print(i)
印出 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
和上一課的 while 版本做同一件事,而少了一行(不用自己 n = n + 1),
也少了一個出錯的地方。
三、for vs while
|
什麼時候用 |
for |
知道要跑幾次、或要走過一串現成的東西 |
while |
不知道要跑幾次——跑到某件事發生為止 |
🔎 這一段是試一下——打了看結果就好,不要留在程式裡。
1for i in range(10):2while user_says_yes():
能用 for 就用 for。
它把「前進」寫死了,所以你不會忘記,也不會寫錯。
四、for 也可以走別的東西
for 走得過的不只數字,一段文字也可以:
🔎 這一段是試一下——打了看結果就好,不要留在程式裡。
1for c in "Python":2 print(c)
一個字一個字印出來,文字本身就是一串東西。
下一課的清單也是。for ... in 走的是「任何一串東西」,
不是只有數字。
⚠️ 不要為了拿位置而寫 range(len(x)):
🔎 這一段是試一下——打了看結果就好,不要留在程式裡。
1names = ["a", "b", "c"]2for n in names: # ✅3for i in range(len(names)): # ⚠️ 除非你真的需要 i
五、break / continue 一樣能用
這兩個字在 for 裡也一樣:
1for i in range(1, 11):2 if i == 5:3 break4 print(i)
印 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)
把積木打散,自己排回去:排回去:把剛才那支程式的積木排好
換你了
用巢狀 for 印出九九乘法表的前三列。
⚠️ 提示:外圈走列、內圈走行;print(i * j, end=" ") 不換行,
一列跑完再 print() 換一行。
到編輯器做這一題:練習:九九乘法表的前三列
做一個
數出 2 到 100 之間有幾個質數(只能被 1 和自己整除)。
🔴 這一題需要一個迴圈套在另一個迴圈裡:外圈走每個數,內圈試除。
做完想一下:內圈真的要試到 n 嗎?試到哪裡就夠了?
到編輯器做這一題:做一個:100 以內有幾個質數
這一課你做了什麼
- 你用
for ... in range(...) 跑了固定次數
- 你知道
range 含頭不含尾
- 你分得出什麼時候該用
for、什麼時候該用 while
如果卡住了
| 你看到 |
多半是因為 |
| 少印一個數字 |
range(n) 不含 n。要含就 range(n + 1) |
range 印出 range(0, 5) |
它是一個產生器。要看內容用 list(range(5)) |
| 巢狀迴圈全擠一行 |
print() 換行那一行位置不對 |
| 迴圈變數在外面用不到 |
for 的變數在迴圈結束後還在,而值是最後一次的 |
在編輯器打開這一課 →