← 返回周历 Python 起步 视频 DeepInfer 101
起步 2

起步 2:遍历列表,构造自己的输出

浏览文字约 3 分钟 · 手算与练习请按正文分段完成 源文件:Markdown 本地渲染版 · 无需联网
本页目录 · 5 节

先修:函数与条件。目标:追踪一次循环,理解输入与输出的关系,通过 Q3。

1. 一组有顺序的数据

本节路线:读第1–3节追踪列表和别名,再做第4节的foundations Q3;先修为起步1的条件选择。命令目录见 起步入口。出口证据不是“出现一个列表”,而是输出满足上限、顺序不变、输入保持原值,并能解释为什么要新建结果容器。

lengths = [2, 8, 0] 创建一个有三项的列表。len(lengths) 是 3。索引从 0 开始,所以 lengths[0] 是 2,lengths[2] 是 0;lengths[3] 超出范围,会产生 IndexError。

空列表 [] 的长度为 0,没有第 0 项。不要因为某次输入非空,就假设所有输入都有第 0 项。

2. for 每次取出一个元素

完整示例:把每个值增加一,放入新列表。

values = [2, 0, 3]
result = []
for value in values:
    result.append(value + 1)
print(result)
循环轮次valueappend 后 result
12[3]
20[3, 1]
33[3, 1, 4]

append 在原列表末尾增加一项。不要写 result = result.append(...):append 修改列表但返回 None,这会把 result 重新绑定到 None。

遇到空输入,循环体执行零次,result 保持 []。另一个常见错误是把 return result 放在循环里面,这会在第一轮就结束函数。想处理全部元素,返回应当放在循环结束之后。

3. 两个名字可以指向同一个列表

original = [2, 8]
alias = original
alias[0] = 99
print(original)

预测后运行:original 也变为 [99, 8]。赋值没有复制这个列表。Q3 要求保留输入,所以应当用新的 result=[] 逐项构造结果。稍后的调试预备课会进一步解释二维列表为什么要逐行复制。

4. Q3:把上限规则放进循环

clamp_lengths([2, 8, 0], 5) 返回 [2, 5, 0]。可以把它想成每个请求最多保留 5 个元素;现在只处理整数长度,不需要理解模型。

每次循环只做一项决定:当前长度超过上限时放哪个值?没有超过时放哪个值?等于上限时应保持多少?不要排序或删除元素;输出顺序和长度与输入一致。

python course/tools/grade.py foundations --question q3 --failfast

5. 解释与调试

若只得到 [2],先检查 return 的缩进;若报 'NoneType' object has no attribute 'append',检查是否接住了 append 的返回值;若输入也变了,检查是否把输入直接当成输出。

出口任务:先写出 [0, 3, 7] 在上限 3 下的结果,再解释为什么“对结果再次应用同样上限”不会改变它。这叫幂等性质,意思就是重复做不会继续改变结果。下一节把循环、列表与状态组合起来。