打烊時,一天的流水躺在紙條上,一杯一行。迴圈可以一行行讀,可總數在第一杯之前就得有個起點。累加器一開始應該裝什麼?
迴圈讓一段程式碼處理很多值。for 迴圈從可迭代物件中依次取出每一項,賦給迴圈變數,然後執行一次迴圈體。報表、清洗和資料處理都離不開它。 你還會區分累加器和內建聚合。
走訪一個集合
迴圈變數會依次接收集合中的每個值。變數名應該描述元素本身,而不是索引。迴圈體需要縮進,每取出一個元素就執行一次。
orders = ["拿鐵", "摩卡", "茶"]
for order in orders:
print(order)每個訂單列印一行
range 產生數字
range(stop) 從 0 開始,到 stop 之前結束。range(start, stop) 從 start 開始。range(start, stop, step) 按 step 跳過。range 是惰性的:迴圈需要時才產生值。
print(list(range(3)))
print(list(range(2, 5)))
print(list(range(0, 10, 2)))三種 range 寫法
累加一個結果
在迴圈之前建立累加器,在迴圈內部更新它,迴圈結束後再使用。累加器可以是數字、列表或字串。
prices = [4.5, 6.0, 3.25]
total = 0
for price in prices:
total += price
print(f"總計:{total:.2f} 元")用迴圈求和
讓迴圈攜帶狀態
累加器是跨迭代攜帶結果的變數。迴圈前初始化,迴圈內更新,迴圈後使用。如果更新寫在迴圈外,只會保留最後一次的值。
prices = [4.5, 3.0, 6.25]
total = 0
count = 0
for price in prices:
total += price
count += 1
print(count, round(total, 2), round(total / count, 2))一個迴圈,三個匯總值
只做聚合時,優先用內建函式
如果迴圈只是求和、計數、最大值或一個是/否判斷,內建函式通常更清楚。any() 遇到第一個真值就停止,all() 遇到第一個假值就停止。需要多個結果或自定義控制流時,再用迴圈。
prices = [4.5, 3.0, 6.25]
print(sum(prices), len(prices), max(prices), min(prices))
print(any(price > 6 for price in prices))
print(all(price > 0 for price in prices))選擇更清楚的聚合方式
用 enumerate 保留行號
enumerate() 同時給出元素和位置,跳過一行時錯誤資訊也不會錯位。用 start 參數對齊人類習慣的行號。不要在走訪列表時刪除元素;建立新列表,或者走訪副本。在收據專案裡,行號正是錯誤資訊有用的原因。
lines = ["Latte|2", "", "Tea|1"]
for line_no, line in enumerate(lines, 1):
if not line:
continue
name, qty = line.split("|")
print(line_no, name, int(qty))跳過空行,位置仍然準確
本課要點
- for item in items 會逐個存取每個值。
- range(stop) 不包含 stop;range(start, stop) 包含 start。
- 累加器必須在迴圈開始前初始化。
- 縮進決定哪些程式碼屬於迴圈體。
- 累加器讓迴圈變成匯總;簡單聚合優先用內建函式。
- enumerate(..., start=1) 讓錯誤資訊裡的行號和人類看到的一致。
常見錯誤
- 把累加器建立在迴圈內部,導致每次迭代都被重置。
- 以為 range(5) 會包含 5。
- 一邊走訪列表一邊修改它,導致漏掉元素。
- 把累加更新寫錯縮進層級,只保留最後一次結果。
- 一邊走訪列表,一邊刪除其中的元素。
走訪三個價格,把它們累加到 total,並列印保留兩位小數的總價。
動手試試
改改變數、先預測輸出,再執行程式碼。第一次點擊「執行程式碼」時會下載 Python 執行時,可能需要幾秒鐘。
練習本課
12 道題,作答後立即看到解釋。