HOWTO · Python

Python 中向后范围

本教程介绍如何在 Python 中使用 `range()` 函数、`reversed()`、切片和计数器进行反向迭代。

本页内容

在 Python 中反向迭代,具体方法取决于你要遍历的内容。需要递减的数值时,使用 range();要反向遍历现有序列且不修改它时,使用 reversed();需要反转后的副本时,则使用切片。

使用 range() 和负步长

range(start, stop, step) 会从 start 朝 stop 的方向生成数值,但不包含 stop。负步长会让数值递减。例如,要从 10 数到 1,可以从 10 开始,并将不包含在结果中的终止值设为 0:

运行此示例:

本节中的代码以及显示的标签或输出仍为英文。

for number in range(10, 0, -1):
    print(number)

从 100 倒数并包含 0 时,使用 range(100, -1, -1):终止值必须比希望包含的最后一个值小 1。如果起始值已经小于终止值,负步长就不会向下计数;应选择方向一致的起始值、终止值和步长。当循环需要数字(例如索引或倒计时数值),而不是集合中的元素时,range() 很有用。

使用 reversed() 反向遍历序列

需要从后往前访问现有序列中的元素时,可以使用 reversed()。它会返回一个迭代器,并保持原序列不变。除了列表、字符串和范围,它也适用于其他可反向迭代的对象。

运行此示例:

本节中的代码以及显示的标签或输出仍为英文。

items = ["first", "second", "third"]
for item in reversed(items):
    print(item)

对于数值序列,reversed(range(5)) 会按从 4 到 0 的顺序迭代。如果数值本来就来自 range,优先使用这种写法;如果要直接指定递减的数值区间,则使用负步长的 range()。由于 reversed() 返回的是迭代器,反向遍历时不需要额外创建一个列表。

使用切片反转列表或字符串

步长为 -1 的切片写作 sequence[::-1],会按相反顺序生成元素。对于列表或字符串,这会创建一个新序列,同时保留原序列。如果你需要反转后的值本身,例如要赋给另一个变量或传给函数,这种写法很简洁。

运行此示例:

本节中的代码以及显示的标签或输出仍为英文。

word = "Python"
backward = word[::-1]
print(backward)

切片会创建副本,因此占用的内存与序列长度成正比。如果只需要反向遍历元素,不需要单独的反转值,可以用 reversed(sequence) 避免复制。同样的切片写法也适用于列表,例如 items[::-1]。

需要自定义循环逻辑时使用计数器

如果每一步都取决于上一轮执行的操作,或者计数器的更新比减 1 更复杂,while 循环会很有用。将计数器设为要处理的第一个值;如果该值是零,就让循环条件包含零;并确保每轮只更新计数器一次:

运行此示例:

本节中的代码以及显示的标签或输出仍为英文。

number = 4
while number >= 0:
    print(number)
    number -= 1
4
3
2
1
0

条件 number >= 0 会包含零。如果使用 number > 0,循环就会在处理零之前结束。对于简单的固定倒计时,range() 写法更短,也不容易因计数器更新而出错;只有在自定义循环逻辑让显式更新更有用时,才选择计数器。

选择合适的反向迭代方法

需要递减的数字或索引序列时,使用负步长的 range()。要反向遍历现有序列且不修改它,也不需要副本时,使用 reversed()。需要新的反转列表或字符串时,使用 [::-1],并记住这会分配新值。如果下一步操作或停止条件取决于自定义逻辑,则在 while 循环中使用计数器。无论采用哪种方法,都应先确定是否要包含端点,再编写 range 的终止值或循环条件;端点处理是最常见的差一错误来源。