迴圈與可迭代
Python 的 for 只有一種,而它是 C++ 的範圍 for。 · ⏱ 約 30 分鐘
你會學到三件事
- Python 沒有
for (int i = 0; i < n; i++)
range() 產生一串數字
enumerate() 在需要位置的時候用
開始之前
C++ 有兩種 for:計數的和範圍的。
Python 只有範圍的那一種,而計數要用 range() 補回來。
🟢 先把編輯器打開,跟著下面一起做:跟著做
一、for ... in
Python 的 for 走的是「一串東西」:
1for i in range(3):2 print(i)
印出 0 1 2。
積木盤上 range 那一顆寫著「數列」。
range(3) 是「0、1、2」這三個數字。⚠️ 不含 3。
| 寫法 |
產生 |
range(3) |
0, 1, 2 |
range(1, 4) |
1, 2, 3 |
range(0, 10, 2) |
0, 2, 4, 6, 8 |
range(3, 0, -1) |
3, 2, 1 |
「含頭不含尾」和 C++ 的 i = 0; i < n 是同一個約定,
只是這次它寫在名字裡而不是條件裡。
二、直接走過東西
不必先算長度再用編號,直接走:
1names = ["a", "b", "c"]2for n in names:3 print(n)
這和 C++ 的 for (string n : names) 一模一樣,只是不用寫型別、不用 auto。
⚠️ 而 Python 裡這是唯一的走法,沒有「用位置走」的那種寫法。
那個方括號的東西在積木上叫「串列」。
三、需要位置的時候:enumerate
真的需要位置的時候,用 enumerate:
1for i, n in enumerate(names):2 print(i, n)
積木上這一顆寫著「配上序號 … 起點 …」——那個「起點」預設是 0。
印出:
0 a
1 b
2 c
enumerate 一次給你兩樣東西:位置和值。
而 for i, n in ... 這個寫法叫拆包:右邊給一對,左邊拆成兩個名字。
⚠️ 不要為了拿位置而寫 for i in range(len(names))。
那能跑,而 enumerate 是這個語言想要你寫的方式——
少一個地方會寫錯,就是少一個 bug(C++ 入門第 14 課那句話)。
四、while 一模一樣
while 與 C++ 沒有差別,只差縮排:
1n = 32while n > 0:3 print(n)4 n -= 1
⚠️ 沒有 n--。 Python 只有 -=。
積木上 while 那一顆寫著「當 … 成立時,重複」。
(理由是 --n 在 Python 裡是合法的,它是「負的負的 n」,也就是 n。
所以那個寫法不會報錯,而且什麼都不做。刪掉它比留一個陷阱好。)
完成的樣子
這一課的參考做法——程式碼每一行的號碼,就印在對應的那塊積木上。
1for i in range(3):2 print(i)3 4names = ["a", "b", "c"]5for i, n in enumerate(names):6 print(i, n)7 8n = 39while n > 0:10 print(n)11 n -= 1
換你了
用 range 印出 1 到 10 之間的偶數,不要用 if。
提示:range 的第三個參數是步長。
到編輯器做這一題:練習:印出 1 到 10 之間的偶數,不要用 if
做一個
一串名字 ["甲", "乙", "丙"],印出「第 1 名是 甲」這樣三行。
🔴 規定要用 enumerate,不准自己開一個計數變數。
做完再用 range(len(names)) 寫一次,比較兩份哪一份比較不容易寫錯。
到編輯器做這一題:做一個:第幾名是誰
這一課你做了什麼
- 你用
for ... in 走過了一串數字和一串文字
- 你用
enumerate 同時拿到了位置和值
- 你知道 Python 沒有
++ 和 --
如果卡住了
| 你看到 |
多半是因為 |
| 少印一個數字 |
range(n) 不含 n。要含就寫 range(n + 1) |
for i in names 拿到的是值不是位置 |
那就是它的行為。要位置用 enumerate |
n-- 沒有反應 |
它是「負負得正」,什麼都沒做。要用 n -= 1 |
range 印出來是 range(0, 3) |
range 是一個產生器,不是清單。要看內容用 list(range(3)) |
在編輯器打開這一課 →