Semorphe

迴圈與可迭代

Python 的 for 只有一種,而它是 C++ 的範圍 for。 · ⏱ 約 30 分鐘

你會學到三件事

  1. Python 沒有 for (int i = 0; i < n; i++)
  2. range() 產生一串數字
  3. enumerate() 在需要位置的時候用

開始之前

C++ 有兩種 for:計數的和範圍的。

Python 只有範圍的那一種,而計數要用 range() 補回來。

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

一、for ... in

Python 的 for 走的是「一串東西」:

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

印出 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)
"a""b""c"串列變數names變數n印出對裡的每一個i設定names為123

這和 C++ 的 for (string n : names) 一模一樣,只是不用寫型別、不用 auto。

⚠️ 而 Python 裡這是唯一的走法,沒有「用位置走」的那種寫法。

那個方括號的東西在積木上叫「串列」。

三、需要位置的時候:enumerate

真的需要位置的時候,用 enumerate:

1for i, n in enumerate(names):2    print(i, n)
變數names配上序號起點變數i變數n印出對裡的每一個i,n12

積木上這一顆寫著「配上序號 … 起點 …」——那個「起點」預設是 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
3變數n0>變數n變數n1把減去印出當成立時,重複設定n為1234

⚠️ 沒有 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
3數列變數i印出"a""b""c"串列變數names配上序號起點變數i變數n印出3變數n0>變數n變數n1把減去印出當成立時,重複設定n為對裡的每一個i,n設定names為對裡的每一個i12456891011

換你了

用 range 印出 1 到 10 之間的偶數,不要用 if。

提示:range 的第三個參數是步長。

到編輯器做這一題:練習:印出 1 到 10 之間的偶數,不要用 if

做一個

一串名字 ["甲", "乙", "丙"],印出「第 1 名是 甲」這樣三行。

🔴 規定要用 enumerate,不准自己開一個計數變數。 做完再用 range(len(names)) 寫一次,比較兩份哪一份比較不容易寫錯。

到編輯器做這一題:做一個:第幾名是誰

這一課你做了什麼

如果卡住了

你看到 多半是因為
少印一個數字 range(n) 不含 n。要含就寫 range(n + 1)
for i in names 拿到的是值不是位置 那就是它的行為。要位置用 enumerate
n-- 沒有反應 它是「負負得正」,什麼都沒做。要用 n -= 1
range 印出來是 range(0, 3) range 是一個產生器,不是清單。要看內容用 list(range(3))
在編輯器打開這一課 →