我酷爱python的原因,就是因为它每个细节都竭尽所能做到极致,就比如风云接下来要介绍的range,这个函数,只要接触过python的人,都不陌生,最常用的例子都是拿来生成循环序列,上手即用,并无深奥的理论,然而,它底层却隐藏着python设计者们的极致观念,在执行循环时,range的效率比list高,这你能想吗?因为它是惰性加载,节省空间,效率就高了,且听我一一道来。
range 是 Python 中一个强大的内置函数,是Python 中构建序列的基础工具,具备灵活性和高效性,在各种迭代和数据处理任务中都非常有用。
1. 基本语法
range(stop) range(start, stop[, step])
- start(可选):序列的起始值,默认是 0。
- stop(必须):序列的终止值(不包含此值)。
- step(可选):序列中的步长,默认是 1。
返回一个不可变的数字序列(range 对象),需要通过迭代或转换为列表才能查看具体的数字。
2. 用法详解
2.1 仅指定终止值
# 从 0 到 9
for i in range(10):
print(i, end=" ") # 输出: 0 1 2 3 4 5 6 7 8 9
2.2 指定起始值和终止值
# 从 5 到 9
for i in range(5, 10):
print(i, end=" ") # 输出: 5 6 7 8 9
2.3 指定步长
# 从 1 到 9,步长为 2
for i in range(1, 10, 2):
print(i, end=" ") # 输出: 1 3 5 7 9
2.4 逆序生成
步长为负数时,生成降序序列:
# 从 10 到 2,步长为 -2
for i in range(10, 1, -2):
print(i, end=" ") # 输出: 10 8 6 4 2
3. 转换为列表
range 本身生成一个不可变对象,可以用 list 函数转换为列表以查看内容:
r = range(5)
print(list(r)) # 输出: [0, 1, 2, 3, 4]
4. 特点与优点
惰性生成:
- range 不会立即生成所有数字,而是按需迭代,节省内存。
- 适合处理大范围数字。
r = range(10**6)
print(len(r)) # 输出: 1000000,占用内存很少
高效性:
- 操作速度快,内存占用低。
5. 使用场景
5.1 遍历循环
for i in range(3):
print(f"Processing item {i}")
5.2 生成序列
numbers = list(range(1, 11)) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
5.3 索引迭代
data = ["a", "b", "c"]
for i in range(len(data)):
print(f"Index {i}, Value {data[i]}")
6. 注意事项
6.1 stop 参数是非包含的
r = range(5) # 包含 0 到 4,不包括 5
6.2 步长为 0 会报错
# 以下代码将抛出 ValueError:
range() arg 3 must not be zerorange(1, 10, 0)
6.3 超出范围
即使 range 的范围超出常规整数范围,Python 会自动支持超大整数。
r = range(10**6, 10**6 + 3)
print(list(r)) # 输出: [1000000, 1000001, 1000002]
7. 高级用法
7.1 判断值是否在范围中
range 对象支持 in 运算符:
r = range(10)
print(5 in r) # 输出: True
print(15 in r) # 输出: False
7.2 逆序遍历
for i in reversed(range(5)):
print(i, end=" ") # 输出: 4 3 2 1 0
7.3 配合枚举
data = ["apple", "banana", "cherry"]
for i, value in enumerate(data):
print(f"Index {i}: {value}")
8. 实际案例
8.1 分页实现
page_size = 10
total_items = 35
for start in range(0, total_items, page_size):
end = min(start + page_size, total_items)
print(f"Processing items {start} to {end - 1}")
8.2 等差数列生成
start = 1
end = 20
step = 3
arithmetic_sequence = list(range(start, end, step))
print(arithmetic_sequence) # 输出: [1, 4, 7, 10, 13, 16, 19]
9. 总结
特性 | 描述 |
参数 | start、stop、step 三个参数灵活控制序列范围和步长。 |
惰性生成 | 高效内存使用,不立即创建完整序列,适合处理大范围数字。 |
支持迭代 | 与循环结合使用,提供简单高效的遍历机制。 |
转换支持 | 可通过 list 转换为列表或其他集合类型。 |