什么是 range()?
在学习 for 循环时,我们经常会遇到这样的需求:
让程序重复执行 10 次、20 次,或者按照一定规律生成一组数字。
例如:
for num in range(5):
print(num)
输出:
0
1
2
3
4
这里:
range(5)
就是一个 range 对象。
它可以理解成:
0
1
2
3
4
这样一组按照规律产生的整数序列。
range() 的基本语法
range() 的完整语法是:
range(start, stop, step)
三个参数分别表示:
| 参数 | 含义 | 是否必须 |
|---|---|---|
start |
开始位置 | 可选 |
stop |
结束位置 | 必须 |
step |
每次变化多少 | 可选 |
例如:
range(1, 10, 2)
可以理解为:
从 1 开始
↓
每次增加 2
↓
到 10 之前停止
得到:
1
3
5
7
9
注意:
stop是结束边界,但这个数字本身不会被包含进去。
range() 最简单的用法
如果只传入一个参数:
range(stop)
那么:
start = 0
step = 1
也就是说:
range(5)
实际上可以理解为:
range(0, 5, 1)
所以:
for num in range(5):
print(num)
输出:
0
1
2
3
4
为什么没有 5?
这是学习 range() 时最重要的知识之一。
例如:
range(5)
不是:
0 1 2 3 4 5
而是:
0 1 2 3 4
因为:
range()的结束值stop不包含在序列中。
也就是:
start ≤ 数字 < stop
例如:
range(1, 5)
结果是:
1
2
3
4
而不是:
1
2
3
4
5
可以记住一句话:
range()包头不包尾。
range(start, stop)
如果希望从指定的数字开始,可以传入两个参数:
range(start, stop)
例如:
for num in range(1, 5):
print(num)
输出:
1
2
3
4
这里:
range(1, 5)
表示:
从 1 开始
↓
每次增加 1
↓
到 5 之前停止
所以得到:
1
2
3
4
start 默认值是 0
如果不写 start:
range(5)
Python 默认:
start = 0
因此:
range(5)
等价于:
range(0, 5)
而:
range(0, 5)
又可以进一步理解为:
range(0, 5, 1)
因为 step 默认也是:
1
step 是什么?
step 表示:
每次移动或变化多少。
例如:
range(2, 11, 2)
表示:
从 2 开始
↓
每次增加 2
↓
到 11 之前停止
所以:
for num in range(2, 11, 2):
print(num)
输出:
2
4
6
8
10
这里:
start = 2
stop = 11
step = 2
使用 step 生成奇数
step 不一定是 2。
例如:
for num in range(1, 10, 2):
print(num)
输出:
1
3
5
7
9
因此:
range(1, 10, 2)
非常适合生成一组奇数。
step 可以是负数
step 不仅可以让数字增加,也可以让数字减少。
例如:
for num in range(40, 0, -10):
print(num)
输出:
40
30
20
10
这里:
start = 40
stop = 0
step = -10
每次减少:
10
所以:
40
↓ -10
30
↓ -10
20
↓ -10
10
↓ -10
0
但 0 不包含在结果中,因此最终只有:
40
30
20
10
使用负数 step 倒序生成数字
例如:
for num in range(5, 0, -1):
print(num)
输出:
5
4
3
2
1
这种写法经常用于:
- 倒计时
- 倒序处理数据
- 从后往前遍历数字
例如倒计时:
for second in range(5, 0, -1):
print(second)
print("Start!")
输出:
5
4
3
2
1
Start!
range() 的三个参数总结
可以把:
range(start, stop, step)
理解成一条路线:
从哪里开始?
↓
start
↓
每次走多远?
↓
step
↓
走到哪里停止?
↓
stop
例如:
range(2, 11, 2)
就是:
从 2 开始
↓
每次 +2
↓
到 11 之前停止
结果:
2 4 6 8 10
range() 只能接受整数
range() 用来生成整数序列。
因此它的参数必须是整数。
正确:
range(1, 10)
错误:
range(1.5, 10)
会产生:
TypeError
类似:
TypeError: 'float' object cannot be interpreted as an integer
原因是:
1.5
属于:
浮点数(float)
而 range() 要求使用:
整数(int)
range() 不能没有参数
下面这种写法:
range()
是不允许的。
因为 range() 至少需要一个:
stop
参数。
例如:
range(5)
是正确的。
而:
range()
会产生:
TypeError
range() 本身不是列表
这是一个非常值得注意的细节。
例如:
numbers = range(5)
print(numbers)
你不会得到:
[0, 1, 2, 3, 4]
而会看到类似:
range(0, 5)
因为:
range()返回的是一个range对象,而不是list。
可以使用:
type()
查看它的类型:
numbers = range(5)
print(type(numbers))
结果类似:
<class 'range'>
如何把 range() 转换成列表?
如果确实需要一个真正的列表,可以使用:
list()
例如:
numbers = list(range(5))
print(numbers)
输出:
[0, 1, 2, 3, 4]
这里发生了两步:
range(5)
↓
生成整数序列
↓
list()
↓
转换成列表
所以:
list(range(5))
得到:
[0, 1, 2, 3, 4]
使用 range() 创建偶数列表
例如:
numbers = list(range(2, 11, 2))
print(numbers)
输出:
[2, 4, 6, 8, 10]
这里:
range(2, 11, 2)
生成:
2
4
6
8
10
再通过:
list()
把它转换成:
[2, 4, 6, 8, 10]
range() 和 list() 的区别
| 写法 | 结果 |
|---|---|
range(5) |
range 对象 |
list(range(5)) |
列表 [0, 1, 2, 3, 4] |
通常:
for num in range(5):
print(num)
直接使用 range() 就足够了。
如果你真的需要保存成列表,再使用:
numbers = list(range(5))
range() 最常见的使用场景
1. 重复执行指定次数
例如打印 5 次:
for _ in range(5):
print("Hello")
输出:
Hello
Hello
Hello
Hello
Hello
这里使用:
_
表示:
这个循环变量我不需要使用。
如果只是想重复执行某段代码,而不关心当前数字,这种写法很常见。
2. 生成连续数字
for num in range(1, 6):
print(num)
输出:
1
2
3
4
5
3. 按固定间隔生成数字
例如每次增加 5:
for num in range(0, 21, 5):
print(num)
输出:
0
5
10
15
20
4. 倒序生成数字
for num in range(10, 0, -1):
print(num)
输出:
10
9
8
7
6
5
4
3
2
1
一个容易犯的错误:stop 不包含
很多初学者看到:
range(1, 10)
会以为:
1 到 10
但实际上是:
1 到 9
因为:
stop = 10
不会被包含。
例如:
for num in range(1, 10):
print(num)
结果:
1
2
3
4
5
6
7
8
9
如果想得到:
1 到 10
应该写:
for num in range(1, 11):
print(num)
记住:
想包含某个数字作为最后一个值,就需要把
stop设置成它再加上 1(在step为正数且步长合适的情况下)。
range() 参数速查表
| 写法 | 含义 | 示例结果 |
|---|---|---|
range(stop) |
从 0 开始,每次 +1 |
range(5) → 0~4 |
range(start, stop) |
从 start 开始,每次 +1 |
range(2, 5) → 2,3,4 |
range(start, stop, step) |
自定义开始、结束和步长 | range(2, 10, 2) → 2,4,6,8 |
range(5, 0, -1) |
倒序生成 | 5,4,3,2,1 |
range() 和 for 的关系
range() 本身并不负责循环。
真正负责重复执行的是:
for
例如:
for num in range(5):
print(num)
这里可以拆开:
range(5)
↓
提供一组可以依次获取的整数
↓
for
↓
一个一个取出来
↓
执行循环代码
所以:
range()负责产生整数序列,for负责遍历这个序列。
常见错误
❌ 忘记 stop 不包含
错误理解:
range(1, 5)
认为结果是:
1 2 3 4 5
实际是:
1 2 3 4
❌ 给 range() 传入浮点数
错误:
range(1.5, 5)
因为:
1.5
是 float,不是 int。
❌ 试图让 range() 自动生成小数
例如:
range(0, 1, 0.1)
这是不允许的。
range() 专门处理整数序列,不能直接用浮点数作为 step。
range() 核心知识速查表
| 概念 | 说明 |
|---|---|
range() |
生成整数序列 |
start |
开始值,默认为 0 |
stop |
结束边界,不包含 |
step |
每次变化的步长,默认为 1 |
正数 step |
数字递增 |
负数 step |
数字递减 |
range() 返回值 |
range 对象 |
list(range(...)) |
将 range 转换成列表 |
| 参数类型 | 必须是整数 |
学习小结
掌握 range(),重点记住下面几个规则:
range(stop)
从 0 开始:
0 → stop - 1
range(start, stop)
从 start 开始,每次增加 1:
start → stop - 1
range(start, stop, step)
可以自己控制:
从哪里开始
↓
每次走多远
↓
什么时候停止
例如:
range(2, 11, 2)
得到:
2 4 6 8 10
总结
range()用于生成整数序列。range()最常见的使用场景是配合for循环。range(stop)默认从0开始,每次增加1。range(start, stop)可以指定开始位置。range(start, stop, step)可以指定步长。step为正数时通常表示递增,为负数时通常表示递减。stop永远不包含在生成的序列中,这是使用range()时最重要的规则之一。range()的参数必须是整数,不能直接使用float。range()返回的是range对象,而不是列表。- 如果需要真正的列表,可以使用
list(range(...))进行转换。 - 如果只是为了控制
for循环执行多少次,通常不需要把range()转换成列表。
一句话记忆:
range(start, stop, step)= 从start开始,按照step的步长变化,但永远不会包含stop。