这篇教程将从以下几个方面展开,适合初学者系统地学习:

python基础教程range
(图片来源网络,侵删)
  1. range() 是什么? (核心概念)
  2. range() 的三种基本用法 (最常用的场景)
  3. range() 的核心特点 (为什么它如此高效)
  4. range() 的常见应用场景 (实际代码示例)
  5. range()list 的关系 (一个常见的初学者误区)

range() 是什么?

range() 是 Python 的一个内置函数,用于生成一个整数序列

你可以把它想象成一个“数字生成器”或者“数字范围”,它本身并不会在内存中立即创建所有数字,而是当你需要时(例如在 for 循环中),它会按需生成下一个数字,这个特性使得 range() 在处理大范围数字时非常高效。


range() 的三种基本用法

range() 函数根据传入参数的不同,有三种主要的使用形式。

range(stop) - 生成从 0 到 stop-1 的序列

这是最简单的形式,它只接收一个参数 stop

python基础教程range
(图片来源网络,侵删)
  • 功能:生成一个从 0 开始,到 stop-1 结束的整数序列。
  • 规则:包含起始值 0,但不包含结束值 stop(我们称之为“左闭右开”或“包头不包尾”)。

示例:

# 生成一个从 0 到 5 (但不包括 5) 的序列
# 序列中的数字是: 0, 1, 2, 3, 4
for i in range(5):
    print(i)
# 输出:
# 0
# 1
# 2
# 3
# 4

记忆技巧range(5) 会给你 5 个数字:0, 1, 2, 3, 4


range(start, stop) - 生成从 startstop-1 的序列

当你需要从一个非零的数字开始时,可以使用这种形式。

  • 功能:生成一个从 start 开始,到 stop-1 结束的整数序列。
  • 规则:同样遵循“左闭右开”原则。

示例:

python基础教程range
(图片来源网络,侵删)
# 生成一个从 2 到 6 (但不包括 6) 的序列
# 序列中的数字是: 2, 3, 4, 5
for i in range(2, 6):
    print(i)
# 输出:
# 2
# 3
# 4
# 5

range(start, stop, step) - 生成带有“步长”的序列

这种形式最灵活,可以控制数字之间的间隔。

  • 功能:生成一个从 start 开始,到 stop-1 结束,并且每个数字之间相差 step 的整数序列。
  • 规则
    • step 为正数时,序列递增。start 必须小于 stop
    • step 为负数时,序列递减。start 必须大于 stop
    • step 不能为 0,否则会抛出 ValueError

示例(正向步长):

# 从 1 开始,到 10 结束 (不包括 10),步长为 2
# 序列中的数字是: 1, 3, 5, 7, 9
for i in range(1, 10, 2):
    print(i)
# 输出:
# 1
# 3
# 5
# 7
# 9

示例(反向步长):

# 从 10 开始,到 0 结束 (不包括 0),步长为 -2
# 序列中的数字是: 10, 8, 6, 4, 2
for i in range(10, 0, -2):
    print(i)
# 输出:
# 10
# 8
# 6
# 4
# 2

range() 的核心特点:惰性求值

这是 range() 最强大的特性,也是它与 list 的关键区别。

  • range() 对象本身不存储所有的数字,它只存储了 start, stop, step 这三个信息。
  • 当你遍历 range() 对象时(例如在 for 循环中),它会动态地计算出下一个数字,然后提供给你,用完就丢弃,不会在内存中保存整个列表。

为什么这很重要?

假设你需要遍历从 1 到 1亿 的数字。

  • 使用 range()

    # 这行代码几乎不占用内存,因为它只创建了三个整数 (start=1, stop=100000000, step=1)
    my_range = range(1, 100000001)
    for i in my_range:
        # 在这里才动态生成 i 的值
        pass

    内存占用非常小,无论数字多大。

  • 如果使用 list()

    # 这行代码会立即在内存中创建一个包含 1亿 个数字的列表!
    # 这会消耗掉你电脑大量的内存,甚至导致程序崩溃。
    my_list = list(range(1, 100000001)) 

    内存占用巨大。


range() 的常见应用场景

range() 最主要的应用场景就是配合 for 循环。

按固定次数循环

这是最常见的用法,相当于其他语言中的 for (int i = 0; i < N; i++)

# 打印 "Hello World" 5 次
for _ in range(5):
    print("Hello World")

遍历一个列表的索引

如果你想同时获取列表中元素的索引和值,可以使用 range(len(list))

fruits = ["apple", "banana", "cherry"]
for i in range(len(fruits)):
    print(f"索引 {i} 对应的水果是: {fruits[i]}")
# 输出:
# 索引 0 对应的水果是: apple
# 索引 1 对应的水果是: banana
# 索引 2 对应的水果是: cherry

更 Pythonic 的方式:对于这个场景,使用 enumerate() 函数通常是更好的选择,因为它更清晰、更易读。

for index, fruit in enumerate(fruits):
    print(f"索引 {index} 对应的水果是: {fruit}")

生成数字序列

虽然 range() 本身不是列表,但你可以轻松地把它转换成列表。

# 创建一个列表
numbers = list(range(0, 11, 2))
print(numbers)  # 输出: [0, 2, 4, 6, 8, 10]

range()list 的关系

一个常见的误区是认为 range(5) 就等于 [0, 1, 2, 3, 4]这是不正确的

  • range(5) 是一个 range 对象,它是一个可迭代对象,但不是列表。
  • [0, 1, 2, 3, 4] 是一个 list 对象,它是一个包含了所有实际数字的列表。

你可以用 type() 函数来验证:

my_range = range(5)
my_list = list(my_range)
print(type(my_range))  # 输出: <class 'range'>
print(type(my_list))   # 输出: <class 'list'>
print(my_range)       # 输出: range(0, 5)
print(my_list)        # 输出: [0, 1, 2, 3, 4]

range 对象在打印时显示的是它的构造信息,而不是它包含的所有元素。


特性 描述
功能 生成一个整数序列,用于 for 循环。
语法 range(stop), range(start, stop), range(start, stop, step)
规则 左闭右开:包含 start,不包含 stop
核心优势 惰性求值:内存效率极高,适合处理大范围的数字。
主要用途 控制循环次数。
遍历列表索引。
生成特定规律的数字序列。
类型 返回的是一个 range 对象,而不是 list

掌握 range() 是学习 Python 循环的基础,希望这篇教程能帮助你彻底理解它!