打烊时,一天的流水躺在纸条上,一杯一行。循环可以一行行读,可总数在第一杯之前就得有个起点。累加器一开始应该装什么?
循环让一段代码处理很多值。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 道题,作答后立即看到解释。