Python range 用于快速计数和索引

python range 内置函数创建一个不可变的整数序列,由起点、终点和步长定义。 当你需要可靠的计数器或索引偏移而不想分配一整列数字时使用它。 它展示了起点、终点和步长如何控制 range 产生的整数。 使用 range 的循环模式请看 Python for 循环示例

Python Range 示例:步进计数

输出:

输出将显示在这里...

输出:

钢笔: 10 毫米
订书机: 30 毫米

示例解析

  1. range(0, len(items), 2) 以步长 2 遍历列表索引。
  2. 终点值是排他的,因此不会到达 len(items)
  3. 每个索引读取一个元素并打印与索引绑定的值(10、30)。

Python range 常见坑

错误 1:以为终点值会被包含。

for n in range(1, 5):
    print(n)
for n in range(1, 6):
    print(n)

原因:range 在终点之前停止,因此包含终点的序列需要 stop + 1

错误 2:倒数时仍使用正步长。

for n in range(5, 0, 1):
    print(n)
for n in range(5, 0, -1):
    print(n)

原因:正步长只会向上移动;要倒数,步长必须为负,否则 range 为空。

错误 3:向 start/stop/step 传入非整数。

for rate in range(0, 1, 0.1):
    print(rate)
for basis_points in range(0, 101, 5):
    rate = basis_points / 100
    print(rate)

原因:range 参数必须是整数(或实现 __index__),而步长不能为 0。

python range vs list(range):怎么选

使用 range 当…使用 list(range(...)) 当…
你只需要按整数迭代或索引。你必须存储或后续修改这些数字。
你希望循环时保持常量内存。你愿意为具体列表付出 O(n) 内存。
你需要一个起点/终点/步长可预测的序列对象。你需要 appendsort 等列表方法。

经验法则:迭代与偏移用 range;只有在确实需要全部值时才把它变成列表。 当你需要索引+值对时,优先用 enumerate —— 见 Python enumerate 示例

性能考虑

range 只存储起点、终点和步长,因此即使序列很大也仅使用 O(1) 内存。 像 n in range(...) 这样的成员测试对整数是常量时间,比扫描列表更快。 如果你调用 list(range(...)),会为每个值分配 O(n) 的内存与时间,因此只有在确实需要列表时才这么做。

更多 Python range 模式

用负步长倒数重试次数。

for remaining in range(3, 0, -1):
    print(f"将在 {remaining}s 后重试")

负步长让序列向下移动,终点仍是排他的。 这能让倒计时短而可预测,无需额外条件。

生成工作时间段而不存列表。

for hour in range(9, 18):
    print(f"{hour}:00")

range(9, 18) 生成 9 到 17,符合 9-17 的工作时间段(终点排除)。 这是生成固定时段的干净方式,无需预先构建数字列表。

何时使用 Python range

  • 当你需要计数器、偏移或固定步长循环,并且数据是整数序列时使用。
  • 当你希望使用节省内存的序列而不是预先构建的列表时使用。
  • 避免用于非整数步长;先缩放为整数或使用其他数值工具。
  • 除非需要保存或修改数值,否则不要使用 list(range(...))