ZetCode

Python range 函数

上次修改时间:2025 年 4 月 11 日

这份全面的指南探讨了 Python 的 range 函数,该函数生成数字序列。我们将介绍基本用法、步长参数、负数范围,以及迭代和序列生成的实际示例。

基本定义

range 函数生成一个不可变的数字序列。它通常用于在 for 循环中重复执行特定次数。

主要特点:返回一个 range 对象(不是列表),内存效率高,支持起始、停止和步长参数,并且可以与正/负步长一起使用。

基本 Range 用法

以下是一个简单的用法示例,展示了 range 如何使用不同的参数组合生成数字序列。

basic_range.py
# 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 循环中重复执行特定次数的动作。

looping.py
# 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 可以生成各种数字序列,用于数学运算或数据处理。

sequences.py
# 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_ranges.py
# 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 与列表替代方案进行比较,以演示其在大序列中的内存效率。

memory.py
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 支持完整的序列操作并保持一致的性能。

最佳实践

资料来源

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。到目前为止,我已经撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出所有 Python 教程