Python range 函数
上次修改时间:2025 年 4 月 11 日
这份全面的指南探讨了 Python 的 range
函数,该函数生成数字序列。我们将介绍基本用法、步长参数、负数范围,以及迭代和序列生成的实际示例。
基本定义
range
函数生成一个不可变的数字序列。它通常用于在 for
循环中重复执行特定次数。
主要特点:返回一个 range 对象(不是列表),内存效率高,支持起始、停止和步长参数,并且可以与正/负步长一起使用。
基本 Range 用法
以下是一个简单的用法示例,展示了 range
如何使用不同的参数组合生成数字序列。
# Single parameter (stop) print(list(range(5))) # [0, 1, 2, 3, 4] # Two parameters (start, stop) print(list(range(2, 6))) # [2, 3, 4, 5] # Three parameters (start, stop, step) print(list(range(1, 10, 2))) # [1, 3, 5, 7, 9] # Negative step print(list(range(10, 0, -1))) # [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
此示例显示了具有不同参数组合的 range
。使用一个参数时,它从 0 开始。使用两个参数时,它从第一个数字开始。
步长参数控制数字之间的增量。负步长创建降序序列。请注意,我们转换为列表是为了显示目的。
使用 Range 循环
range
最常见的用法是在 for
循环中重复执行特定次数的动作。
# Simple countdown for i in range(5, 0, -1): print(f"T-minus {i} seconds") print("Blastoff!") # Multiplication table for i in range(1, 6): for j in range(1, 6): print(f"{i*j:4}", end="") print()
第一个循环从 5 倒数到 1。第二个循环通过嵌套两个 range 生成一个 5x5 的乘法表。
这演示了 range
如何精确控制循环迭代,而无需手动管理计数器。
创建数字序列
range
可以生成各种数字序列,用于数学运算或数据处理。
# Even numbers under 20 evens = list(range(0, 20, 2)) print(evens) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] # Powers of 2 powers = [2**x for x in range(0, 11)] print(powers) # [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024] # Floating-point range simulation frange = [x/10 for x in range(0, 10)] print(frange) # [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9]
这些示例展示了如何生成特定的数字序列。带有 range
的列表推导式创建更复杂的序列。
对于浮点数范围,我们通过划分整数范围来模拟它们,因为 range
仅适用于整数。
负数范围和步长
range
可以优雅地处理负数和步长,从而允许在两个方向上灵活地生成序列。
# Negative start print(list(range(-5, 0))) # [-5, -4, -3, -2, -1] # Negative start and stop print(list(range(-10, -15, -1))) # [-10, -11, -12, -13, -14] # Mixed signs print(list(range(-2, 3))) # [-2, -1, 0, 1, 2] # Large step print(list(range(0, -10, -2))) # [0, -2, -4, -6, -8]
这些示例演示了 range
在使用负数参数时的行为。步长方向必须与起始/停止关系匹配。
负步长创建降序序列。步长符号必须与从开始到停止的进程一致。
内存效率
此示例将 range
与列表替代方案进行比较,以演示其在大序列中的内存效率。
import sys # Range object r = range(1000000) print(sys.getsizeof(r)) # Typically 48 bytes # Equivalent list l = list(range(1000000)) print(sys.getsizeof(l)) # Typically 8448728 bytes # Iteration works the same for i in range(1000000): if i == 10: break print(i, end=" ")
这显示了 range
的恒定内存使用量,与序列长度无关,而列表的大小会随着序列大小而增长。
尽管按需生成数字,但 range
支持完整的序列操作并保持一致的性能。
最佳实践
- 计数循环首选 range: 比 while 循环更易读
- 使用步长参数: 用于非单位增量/减量
- 考虑内存: Range 对象比列表更有效
- 与 enumerate 结合使用: 用于序列中的索引-值对
- 文档范围: 清楚地表明端点是否包含在内
资料来源
作者
列出所有 Python 教程。