控制程式流程—for 迴圈
range 是啥?
Python 的 range() 格式是:
range(start, stop, step)
其中:
start # 起始值,會包含
stop # 結束值,不包含
step # 每次增加或減少多少
如果 step 是負數,就可以倒數。
一個參數:range(stop)
print(list(range(5))) # [0, 1, 2, 3, 4]
# 等同於
print(list(range(0, 5, 1)))
兩個參數:range(start, stop)
print(list(range(2,5))) # [2, 3, 4]
# 等同於
print(list(range(2,5,1)))
三個參數:range(start, stop, step)
print(list(range(1, 10, 2))) # [1, 3, 5, 7, 9]
step 是負數:倒著跑
print(list(range(5, 0, -1))) # [5, 4, 3, 2, 1]
如果想倒著跑到 0,要這樣寫
print(list(range(5, -1, -1))) # [5, 4, 3, 2, 1, 0]
for 迴圈
for i in range(10):
print(i, end=" ") # 0 1 2 3 4 5 6 7 8 9
所以格式是
for i in <一個可迭代物件>
可迭代物件除了 range、list,也可以是字串:
a = "axxple"
x = 0
for i in a:
if i == "x":
x += 1
print(x) # 2
上面程式碼也可以寫成:
a = "axxple"
print(a.count("x")) # 2
提早結束迴圈:break 與 continue
break:跳離整個迴圈,接著執行迴圈結束後的下一個指令。
continue:略過本回合剩下的程式,直接準備進入下一回合。是否還有下一回合,取決於迭代是否結束。
for i in range(100):
if input() == "1":
print("It is 1")
continue
print("It is not 1")
break
輸出:
1
It is 1
1
It is 1
1
It is 1
2
It is not 1
for 迴圈如何逐項取值
for 迴圈會依序從可迭代物件中取得下一個值,再把這個值指定給迴圈變數。
例如:
a = [10, 20, 30]
for x in a:
print(x)
輸出:
10
20
30
對串列進行正向走訪時,可以暫時使用下面的簡化模型理解:
a = [10, 20, 30]
index = 0
while index < len(a):
x = a[index]
index += 1
print(x)
可以把流程想成:
index = 0 → 取得 a[0]
index = 1 → 取得 a[1]
index = 2 → 取得 a[2]
index = 3 → 已到串列結尾,迴圈結束
這只是方便理解串列走訪的簡化模型。Python 實際上會先建立 Iterator(迭代器),再逐次取得下一個值,因此 for 也可以走訪字串、range 等其他可迭代物件。
走訪時修改串列長度要小心
如果在走訪串列時刪除元素,後面的元素會向左移,但迴圈仍會繼續前進,因此可能跳過某些元素。
a = [1, 2, 2, 2, 3]
for x in a:
if x == 2:
a.remove(x)
print(a) # [1, 2, 3]
簡單記法:
串列元素被刪除
→ 後面的元素向左移
迴圈的位置仍然向前
→ 可能跳過剛剛向左移的元素