Python for循环基础语法与range()函数用法
在 Python 中,for 循环本质上是一个“迭代访问器”,负责逐一取出容器或序列中的每一个元素;而 range() 函数则是一个高效的整数序列生成器。理解这两者的核心,在于掌握“变量如何接收当前项”以及“区间如何确定边界与步长”。本文将从基础语句结构切入,结合内存运行机制与实操示例,彻底理清两者的用法。
1. for 循环的核心执行逻辑
与其他基于计数器判断(如 for (int i=0; i<n; i++))的语言不同,Python 的 for 语句不依赖手动维护的索引变量。只要目标对象支持遍历(即可迭代对象,如列表、元组、字符串),for 就会从前到后取出每个元素并赋值给目标变量,直到取尽为止。
其标准语法结构如下:
for 临时变量 in 可迭代序列:
执行代码块
下面是一个遍历字符串的最小示例:
text = "PYTHON"
for char in text:
print(char)
Y
T
H
O
N
在这段执行过程中,不需要预先计算字符串的长度。Python 解释器会在内部维护读取状态,每执行一次循环体,就自动将下一个字符传递给 char。当没有更多元素时,自动退出循环并继续执行后续代码。
2. 认识 range() 函数及其参数规则
当我们并不是想遍历现成的数据列表,而是需要让程序“重复执行固定次数”或者“生成一段指定范围的数字”时,就需要用到内置函数 range()。
range() 能够接收最多三个整数参数,形式为 range(start, stop[, step])。理解它最关键的原则是:左闭右开(包含起始值,不包含结束值)。
2.1 单参数模式:range(stop)
只传入一个参数时,Python 默认起始值 start = 0,默认步长 step = 1。生成的区间是 0 到 stop - 1,总计 stop 个数字。
for i in range(4):
print(i, end=" ")
2.2 双参数模式:range(start, stop)
传入两个参数时,第一个参数为确切的起点,第二个参数为终点(不含)。步长依旧默认为 1。
for i in range(2, 6):
print(i, end=" ")
2.3 三参数模式:range(start, stop, step)
第三个参数用于指定步长(即每次递增或递减的间隔)。如果步长为正数,则数值逐步增加;如果步长为负数,则数值逐步减少。
# 打印 1 到 10 之间的所有奇数
for i in range(1, 10, 2):
print(i, end=" ")
3. 典型实战场景与组合写法
3.1 反向倒序计数
当需要倒序循环(例如从 5 倒数到 1)时,必须同时满足两个条件:起始值大于结束值,且步长为负数。初学者常犯的错误是忽略了右侧不包含原则。若想包含 1,结束值必须设为 0。
# 倒序输出 5, 4, 3, 2, 1
for i in range(5, 0, -1):
print(i, end=" ")
3.2 利用 range(len(...)) 按索引遍历与修改
如果直接使用 for item in list,我们只能读取元素,若在循环体内对 item 重新赋值,改变的只是临时变量的指向,并不会修改原列表。若需要根据位置修改列表内容,则可以配合 len() 生成索引序列:
scores = [80, 92, 75, 60]
for i in range(len(scores)):
# 将每个成绩提升 5 分
scores[i] += 5
print(scores)
4. 运行机制与核心差异:range 不是真正的列表
很多初学者会直觉地认为 range(1000000) 会在内存中一次性塞满一百万个数字。事实并非如此。在 Python 3 中,range 是一个不可变的序列类型(惰性求值对象)。
无论传入的区间有多大,range 对象占用的内存空间都是固定且极小的。它仅在内部记录起始点、终点和步长,只有在循环迭代“走到这一步”时,才会实时算出当前值并返回。
5. 常见易错点与注意事项
range() 的所有参数都必须是整数(int),传入浮点数(如 range(0, 1.5, 0.5))会直接引发 TypeError。若需要生成浮点数序列,可以使用列表推导式配合除法,或引入 numpy.arange()。
当
start < stop 时,步长必须为正;当 start > stop 时,步长必须为负。如果设置了相互矛盾的方向,例如 range(5, 1, 1),Python 不会抛出异常,而是会直接生成一个空序列,导致循环体内代码一次都不执行。
如果使用
for item in my_list 并在循环体内部调用 my_list.remove() 或 my_list.append(),会导致迭代游标发生位移错乱,造成漏读元素。若需过滤列表,建议使用列表推导式构建新列表。
6. 知识体系速查总结
为了方便日常编写与核对,下表梳理了 range() 各种调用方式的输出特征:
| 代码示例 | 生成序列(等效列表) | 循环次数 | 核心特征 |
|---|---|---|---|
range(5) |
[0, 1, 2, 3, 4] |
5 | 从 0 开始,终止于 5-1 |
range(1, 5) |
[1, 2, 3, 4] |
4 | 自定义起始点,右边界排除 |
range(0, 10, 3) |
[0, 3, 6, 9] |
4 | 指定跨度,跳跃提取 |
range(5, 0, -1) |
[5, 4, 3, 2, 1] |
5 | 负步长反向递减 |
range(3, 3) |
[] |
0 | 起点等于终点,为空序列 |
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









