
range(start, stop) 采用左闭右开(含起始、不含终止)的索引约定,核心原因是为了与序列长度自然对齐、避免重复减1,并统一支持零基索引下的安全遍历。
python 的 `range()` 函数采用左闭右开区间设计,核心原因是为了与序列长度自然对齐、避免重复减1,并统一支持零基索引下的安全遍历。
在 Python 中,range(2, 10) 生成 [2, 3, 4, 5, 6, 7, 8, 9](不含 10),这一设计并非随意,而是经过深思熟虑的工程权衡。其逻辑根基在于与零基索引(zero-based indexing)和常见遍历模式无缝协同。
最典型的应用场景是遍历列表或字符串等序列:
arr = ['a', 'b', 'c', 'd', 'e']
for i in range(len(arr)):
print(f"Index {i}: {arr[i]}")
输出为:
Index 0: a Index 1: b Index 2: c Index 3: d Index 4: e
✅ 这里 range(len(arr)) 直接生成 range(0, 5),完美覆盖所有合法下标 0 到 4 —— 无需手动写 len(arr) - 1。若 range 是闭区间(如 range(0, 5) 包含 5),则会越界访问 arr[5],引发 IndexError;若改为 range(0, len(arr)-1),则漏掉最后一个元素,违背直觉且易出错。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
此外,该设计还带来多重一致性优势:
-
与切片语法统一:
s[2:10]同样是左闭右开,range(2, 10)可直接用于构造等效索引; -
数学表达简洁:
len(range(a, b)) == max(0, b - a)恒成立,便于推理与计算; -
空范围语义清晰:当
start >= stop时(如range(5, 3)),结果为空,符合“从起点到终点(不达)”的直观含义。
⚠️ 注意事项:
-
range()不是“数数到 stop”,而是“生成从 start 开始、每次加 step、且严格小于 stop 的整数序列”; - 它的设计服务于迭代安全性与代码可读性,而非单纯模仿数学区间符号;
- 尽管初学者可能困惑于“为何不包含 stop”,但一旦理解其与
len()和索引边界的协同逻辑,便能体会到这一设计的精妙与稳健。
总之,range 的左闭右开特性不是历史包袱,而是 Python “显式优于隐式”“简单胜于复杂”哲学的体现——用一致、安全、少出错的方式,支撑最频繁的循环需求。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










