HOWTO · Python

如何在 Python 中从 1 开始 for 循环

了解如何在 Python 中用 range() 从 1 开始计数、用 enumerate() 从 1 开始为项目编号,以及用切片跳过第一项。数值循环使用 range(),显示编号使用 enumerate(),选择项目使用切片;Python 列表索引仍然从 0 开始。

本页内容

若要让 Python 循环从 1 数到数字 n,请使用 range(1, n + 1)。range() 会包含起始值,但在结束值之前停止,因此将结束值加 1 就能包含 n。这会改变循环生成的数字,不会改变列表的索引。如果你想在输出中为项目编号,或跳过第一项,则应改用 enumerate() 或切片。本候选稿中的示例已执行,所提供的运行结果支持这些行为。

使用 range() 让数值循环从 1 开始

将 range() 的起始值设为 1,并把结束值设为比最后一个数字大 1。例如,下面的循环会从 1 数到 5:

n = 5
for number in range(1, n + 1):
    print(number)
1
2
3
4
5

第一个参数是起始数字,第二个参数是排除在外的结束值。因此,range(1, 6) 会生成 1、2、3、4 和 5。若要使用不同的结束数字,请替换 n;若要使用不同的起始数字,请替换 1。你也可以提供第三个参数作为步长,例如 range(1, n + 1, 2) 会每次递增 2。自定义辅助函数可以封装对 range() 的调整以便重复使用,但单次循环无需这样做。生成器表达式也可以通过给每个值加 1 来生成调整后的数值,不过对于这种计数任务,直接使用 range() 更清晰。

使用 enumerate() 从 1 开始为项目编号

如果你要处理项目,并向读者显示每个项目的位置,请使用 enumerate(items, start=1)。它会在每次迭代时提供一个编号和对应的项目:

items = ["a", "b", "c"]
for number, item in enumerate(items, start=1):
    print(number, item)
1 a
2 b
3 c

这里,number 依次取得显示编号 1、2 和 3,而 item 则依次取得列表中的各个值。参数 start=1 会改变 enumerate() 生成的编号,但不会改变列表实际从 0 开始的索引。这种写法适合生成带编号的输出,例如列出姓名,或以便于读者理解的序数展示各行。如果还需要通过 Python 索引访问项目,请记住显示编号比索引大 1;在代码中应将这两个概念区分开来。

要跳过第一项时使用切片

如果任务是处理列表中第一项之后的所有值,可以遍历切片 items[1:]:

items = ["header", "first", "second"]
for item in items[1:]:
    print(item)
first
second

切片从索引 1 开始,因此这个循环会遍历 "first" 和 "second",而原列表保持不变。切片不会为这些值重新编号,只会选择循环接收哪些值。对于列表,切片会创建一个新列表,其中包含所选项目的引用。如果第一项是标题或因其他原因不应处理,请使用这种方法;若你需要为每个项目计数或编号,则应选择其他方法。

根据任务选择合适的方法

当循环本身需要生成从 1 开始、以 n 结束的数值时,请使用 range(1, n + 1)。当你想遍历所有项目,并同时显示从 1 开始的编号时,请使用 enumerate(items, start=1)。当你想在迭代时略过第一项,请使用 items[1:]。这些方法分别解决不同的问题:更改生成的数字、为展示项目编号,以及选择集合中的一部分。

当步长为 1 时,将排除在外的结束值设为比最后一个整数大 1,即可包含该整数。当步长为其他值时,数列必须恰好落在预期的最后一个值上,且排除在外的结束值必须沿递进方向位于该值之后;加 1 并不是通用的包含规则。即使 enumerate() 提供了从 1 开始的显示编号,Python 列表的索引仍然从 0 开始。选择最简单且符合需求的写法;调整示例时,也要区分循环中的数值、显示编号和列表索引。