Python range 用于快速计数和索引
python range 内置函数创建一个不可变的整数序列,由起点、终点和步长定义。
当你需要可靠的计数器或索引偏移而不想分配一整列数字时使用它。
它展示了起点、终点和步长如何控制 range 产生的整数。
使用 range 的循环模式请看 Python for 循环示例。
Python Range 示例:步进计数
输出:
输出将显示在这里...
输出:
钢笔: 10 毫米
订书机: 30 毫米
示例解析
range(0, len(items), 2)以步长 2 遍历列表索引。- 终点值是排他的,因此不会到达
len(items)。 - 每个索引读取一个元素并打印与索引绑定的值(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) 内存。 |
| 你需要一个起点/终点/步长可预测的序列对象。 | 你需要 append 或 sort 等列表方法。 |
经验法则:迭代与偏移用 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(...))。