Python3 range() 函数用法(保姆级教程)

Python3 range() 函数用法详解:从零开始掌握循环生成器

在 Python 编程中,range() 函数是一个极其基础但又极其强大的工具。它虽然看似简单,却是实现循环控制、遍历序列、生成数值序列的核心组件。无论是初学者编写第一个 for 循环,还是中级开发者优化代码性能,range() 都会频繁登场。今天我们就来彻底搞懂 Python3 range() 函数用法,用真实案例带你一步步掌握它的三种调用方式、常见陷阱与实用技巧。


range() 函数的基本语法与核心作用

range() 是 Python 内置函数之一,它不直接返回列表,而是返回一个可迭代对象(在 Python 3 中是 range 类型),用于生成一系列连续的整数。它的核心作用就是“按需生成数字”,而不是一次性把所有数字都存进内存。

for i in range(5):
    print(i)

输出结果:

0
1
2
3
4

⚠️ 注意:range(5) 生成的是 0 到 4,不包含 5。这就像数数时“从 0 数到 5”要数 5 下,但实际到 4 就停止了。

为什么不用 list(range(5))?

很多初学者会问:“我直接用 list(range(5)) 不就能得到 [0, 1, 2, 3, 4] 吗?”
确实可以,但这里有一个关键点:range() 是惰性求值的
这意味着它不会立刻生成所有数字,只有在被循环或访问时才逐个产生。这在处理大范围数字时非常节省内存。

例如:

large_range = range(1000000)
print(type(large_range))  # <class 'range'>

所以,在不需要显式列表的场景下,优先使用 range()


三种参数形式:从简单到复杂

range() 支持三种调用方式,分别对应不同的使用场景。

1. 单参数形式:range(stop)

最常见,生成从 0 开始,到 stop-1 结束的整数序列。

for i in range(5):
    print(f"当前数字是:{i}")

适合:需要执行固定次数循环,比如打印 5 行文字、遍历 5 个元素。

2. 双参数形式:range(start, stop)

从 start 开始,到 stop-1 结束(不包含 stop)。

for num in range(10, 15):
    print(num)

输出:

10
11
12
13
14

✅ 应用场景:遍历某个特定范围,比如从第 10 天到第 15 天的天气数据。

3. 三参数形式:range(start, stop, step)

支持步长(step)控制,可以跳着生成数字。

for even in range(0, 20, 2):
    print(even)

输出:

0
2
4
6
8
10
12
14
16
18

🎯 高级用法:生成偶数、奇数序列,或每隔几帧处理一次动画帧。

💡 小贴士:step 可以为负数,实现倒序生成!

for i in range(10, 0, -1):
    print(i)

输出:

10
9
8
7
6
5
4
3
2
1

✅ 这是实现倒计时的常用方法。


实际应用案例:让 range() 变得更有用

1. 遍历列表索引

在 Python 中,如果你需要同时获取元素和索引,range(len(list)) 是最常见方式。

fruits = ["苹果", "香蕉", "橙子", "葡萄"]

for i in range(len(fruits)):
    print(f"索引 {i} 的水果是:{fruits[i]}")

输出:

索引 0 的水果是:苹果
索引 1 的水果是:香蕉
索引 2 的水果是:橙子
索引 3 的水果是:葡萄

✅ 优势:避免使用 enumerate() 时对索引不感兴趣的情况。


2. 控制循环次数:模拟输入验证

在编写用户交互程序时,常需要限制输入尝试次数。

max_attempts = 3
password = "123456"

for attempt in range(1, max_attempts + 1):
    user_input = input(f"请输入密码(第 {attempt} 次尝试):")
    if user_input == password:
        print("登录成功!")
        break
    else:
        print("密码错误,请重试。")
else:
    # for 循环正常结束(未 break)时执行
    print("尝试次数已用完,账户已锁定。")

🔑 关键点:range(1, max_attempts + 1) 从 1 开始,避免从 0 开始的“第 0 次尝试”。


3. 生成等差数列:用于图表或数据处理

在科学计算或数据分析中,常需要生成一系列等差值。

temperatures = list(range(0, 101, 10))
print(temperatures)

输出:

[0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

✅ 适用于:绘制温度变化图、设置坐标轴刻度、生成测试数据等。


常见陷阱与注意事项

❌ 陷阱 1:误以为 range() 返回列表

r = range(5)
print(r[2])  # ✅ 可以访问,因为 range 支持索引
print(r[10]) # ❌ 报错:IndexError: range object index out of range

虽然 range 支持 [] 访问,但它不支持切片(如 r[1:4])!

✅ 正确做法:如需切片,先转为列表:

r = range(10)
sliced = list(r[2:6])  # [2, 3, 4, 5]

❌ 陷阱 2:step 为 0 导致无限循环

for i in range(0, 10, 0):
    print(i)  # 这会引发 ValueError

🛑 报错:ValueError: range() arg 3 must not be zero

step 不能为 0,否则无法判断方向。


❌ 陷阱 3:start > stop 且 step > 0 时无输出

for i in range(10, 5, 1):
    print(i)  # 不会输出任何内容

因为从 10 开始,每次加 1,永远无法到达 5,所以循环体不执行。

✅ 解决方案:使用负步长:

for i in range(10, 5, -1):
    print(i)  # 输出:10, 9, 8, 7, 6

性能对比:range vs list

在处理大数据时,性能差异明显。以下是一个对比测试:

import time


start = time.time()
for i in range(1000000):
    pass
time1 = time.time() - start

start = time.time()
for i in list(range(1000000)):
    pass
time2 = time.time() - start

print(f"range 耗时:{time1:.4f} 秒")
print(f"list(range) 耗时:{time2:.4f} 秒")

✅ 实测结果:range 通常快 2~3 倍,内存占用低 90% 以上。


总结:掌握 Python3 range() 函数用法的关键点

通过本文的深入讲解,我们系统梳理了 range() 函数的三种调用方式、实际应用场景以及常见陷阱。它不仅是循环控制的基石,更是提升代码效率的重要工具。

  • 单参数range(stop),适合从 0 开始的简单循环。
  • 双参数range(start, stop),灵活控制起始与结束。
  • 三参数range(start, stop, step),支持步长控制,可正可负。
  • 内存友好range 是惰性生成器,适合大数据量场景。
  • 避免陷阱:注意 step 不能为 0,start > stop 时要搭配负步长。

掌握这些用法后,你就能更优雅地编写循环结构,写出更高效、更易读的 Python 代码。

最后提醒一句:range() 虽小,却是 Python 编程中不可或缺的“小齿轮”——看似不起眼,却支撑着整个循环系统的运转。多用、善用,你的代码会越来越“顺手”。