Menu

Python range() 函数:起始、结束、步长与倒数

Python 中 range() 如何工作:起始值、结束值、步长、负数范围,以及为什么它是惰性的,不会生成列表。

本页包含可运行的编辑器。编辑、运行,立即查看输出。

生成数字的工具

range() 只做一件事:生成一个整数序列。当你需要循环特定的次数,或者遍历一段数字区间时,它就是 for 循环的首选搭档。

最简单的形式只接收一个参数,即结束值(stop):

输出:

0
1
2
3
4

有两个细节常让新手踩坑:

  1. 从 0 开始计数。range(5) 给你五个数字,从 0 开始。
  2. 结束值不包含在内。range(5) 在 5 之前停下,不包括 5 本身。

这些规则在 Python 的切片、索引和 range 操作中都是一致的。一旦你记住了“结束值不包含在内”,就不会再被它绊倒了。

三种形式

range() 可以接收一个、两个或三个参数:

步长是每次跳跃的大小。range(0, 20, 4) 每隔四个数取一个。下次你需要“每隔一个元素”或“每十个样本取一个”时,记得用它。

倒着数

步长可以是负数,这样就能倒着数:

同样,结束值不包含在内:range(10, 0, -1) 在 0 之前停下,而不是停在 0。要包含 0,把结束值设为 -1:

range 是惰性的

在 Python 3 中,range() 不会在内存中构建一个数字列表。它返回一个轻量的 range 对象,按需一次生成一个数字。所以你可以这样写:

一个包含十亿个数字的“范围”几乎不占内存。数字会在循环需要时才生成。

如果你确实需要一个数字列表(因为你想修改它、排序它,或者做更复杂的索引),就显式地转换:

大多数时候你并不需要列表。for i in range(...) 直接就能用。

常见写法

几个你会经常用到的写法:

把某件事做 n 次。

_ 是一种约定,意思是“我不关心这个值”。Python 不会强制要求,但任何读代码的人都能看懂这个意图。

按索引访问序列。

优先使用 enumerate() 而不是 range(len(...)),不过当你确实只需要索引时:

即便如此,大多数时候 enumerate(items) 更简洁。

每隔一个元素遍历一次。

这会打印 a、c、e。不过对于简单的切片,切片语法更直接:items[::2]。

快速生成数字列表。

这是列表推导式,后面会讲到,但数字是由 range 提供的。

range() 不能做什么

有两个需要注意的地方:

  1. range 只生成整数。如果你需要浮点数步长(比如从 0.0 到 1.0,每次增加 0.1),请使用 numpy.arange,或者用循环加上自己的计数器。
  2. range 不能用于任意的可迭代对象。它专门用于整数。如果你想对一个列表“range”,你要找的可能是 enumerate,或者直接遍历列表本身。

综合运用

一个同时用到几种变化的小例子:

两个由 range 驱动的嵌套循环生成了一个表格。注意两个循环都从 1 开始,即 range(1, 6),因为我们想要 1 到 5 的标签。

进入集合类型

你已经学习了条件语句、两种循环和 range。这些控制流足以驱动任何集合。下一章:集合类型本身,包括列表、元组、集合和字典。

常见问题

Python 中 range() 有什么作用?

range() 生成一个整数序列。range(n) 给出 0 到 n-1。range(start, stop) 给出从 start 开始、到 stop 为止(不包括 stop)的整数。range(start, stop, step) 让你选择步长,包括用负步长倒着数。

range() 会创建列表吗?

不会。在 Python 3 中,range() 返回一个轻量的 range 对象,按需生成数字。这就是为什么 range(10**9) 能瞬间完成:它并没有真的分配十亿个整数。如果你确实需要列表,就用 list(...) 包起来。

Python 中如何用 range() 倒着数?

使用负步长:range(10, 0, -1) 依次给出 10、9、8、...、1。记住 stop 值总是不包含在内的,所以要包含 0,你需要写 range(10, -1, -1)。

Coddy 编程语言插图

和 Coddy 一起学编程

开始