GEEK
← 返回首页

什么是 `range()`?如何在循环中使用它?

#随笔

`range()` 是 Python 中专门用来生成**整数序列**的工具,经常和 `for` 循环一起使用。它可以控制循环从哪里开始、到哪里结束,以及每次增加或减少多少。需要特别注意:`range()` 的 `stop` **不包含在结果中**,并且它本身不会直接创建列表。

什么是 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