Range
range() 生成一个 “惰性序列” (不是列表),常用于 for 循环。
语法:
range(stop)
range(start, stop)
range(start, stop, step)
for i in range(10):
print(i)
for i in range(3, 10):
print(i)
for i in range(0, 10, 2):
print(i) # 0 2 4 6 8
for i in range(10, 0, -1):
print(i)
等价:
for i in reversed(range(1, 11)):
print(i)
if x in range(5, 10):
...
range 本身支持快速判断,不会遍历(常量时间)。
len(range(10)) # 10
len(range(3, 10)) # 7
len(range(1, 10, 2)) # 5
list(range(5)) # [0,1,2,3,4]
range 是惰性的,不占内存;但 list 会真正展开。
if range(5): # True
if range(0): # False
- 不可变
- 惰性(不展开、不占用大内存)
- 可以快速判断包含(x in range(…))
- 支持切片(但仍然是 range)
示例:
r = range(0, 20, 2)
r2 = r[1:5]
print(r2) # range(2, 10, 2)
for _ in range(3):
print("hello")
不推荐:
for i in range(len(items)):
print(items[i])
推荐:
for item in items:
print(item)
for i, item in enumerate(items):
print(i, item)
等差序列:
range(start, stop, step)
可以用于:
- 批处理分页
- 数据分片
- 分段任务控制
示例:分页查询(你项目适用)
for offset in range(0, total, batch_size):
batch = data[offset : offset + batch_size]
错误:
x = 0
while x < 1:
...
x += 0.1 # 浮点误差
正确:
for i in range(10):
x = i * 0.1
...
| 用法 | 写法 |
|---|---|
| 0..n-1 | range(n) |
| a..b-1 | range(a, b) |
| 步长 | range(a, b, step) |
| 倒序 | range(b, a, -1) |
| 倒序更安全 | reversed(range(a, b)) |
| 转列表 | list(range(n)) |
| 取长度 | len(range(...)) |
| 判断包含 | x in range(...) |
| 切片 | range(...)[s:e] |
| 无需 index 遍历 | 用 for item in seq |
| 需要 index 遍历 | 用 enumerate |