迭代是什么?
在编程中,迭代是指重复执行一组指令,通常借助循环来完成,直到满足某个条件或处理完集合中的每一项。每次执行这组重复指令的单独一轮,也叫作一次迭代。
更新于 2026年9月24日
一个给 10,000 名用户发送提醒邮件的程序,并不会包含 10,000 份发送代码。发送代码只写一次,放在循环里,循环为每个用户运行一次。每运行一次就是一次迭代,而整个循环就是程序对所有用户进行迭代的方式。
迭代是如何一步步工作的
每个循环都遵循同样的周期:
- 检查。 检验循环条件,这个条件是一个布尔值:还有下一项吗?计数器是否仍低于上限?
- 执行。 如果答案为真,就执行一次循环体。
- 更新。 移到下一项,或者修改计数器。
- 重复。 回到第 1 步。当检查结果为假时,程序继续执行循环之后的代码。
在下面的例子中,循环体执行了五次,每次迭代都把下一个数加到累计总和上:
iteration 1 total is now 1
iteration 2 total is now 3
iteration 3 total is now 6
iteration 4 total is now 10
iteration 5 total is now 15
Done: 15
变量 total 位于循环之外,所以它的值能从一次迭代保留到下一次。这种在循环前设置、在循环内更新的变量叫作累加器,几乎每个用来计算的循环里都有它。
计数循环和条件循环
迭代分为两种。确定迭代会运行已知的次数:列表中每一项运行一次,或者从 1 到 5 的每个数各运行一次。Python 的 for 循环就是为此设计的,常常配合 range() 一起使用。
不确定迭代会一直重复,直到某件事发生为止,执行多少轮事先并不知道。while 循环适合这种情况:
8 years, balance 214.36
每年增长 10% 的钱需要 8 年才能翻倍。程序是通过迭代得出这个结果的,而不是通过解方程。for 循环和 while 循环指南介绍了这两种循环在 Python 中的用法。
遍历集合
大多数循环都是在遍历一个集合:数组中的元素、字符串中的字符、文件中的行。Python 的 for 循环会把每个元素直接交给你,enumerate() 则会附上它的位置:
0 apple
1 banana
2 cherry
在幕后,for 会先用 iter() 向集合请求一个迭代器,然后每次迭代对它调用一次 next()。你也可以自己进行同样的调用:
red
green
blue
no more items
如果没有提供默认值,第四次 next() 会抛出 StopIteration。for 循环正是靠这个异常信号知道集合已经遍历完了。
其他语言用不同的写法表达同样的思想。C 用索引计数,而 Java 和 JavaScript 还提供了一种直接把每个元素交给你的循环:
for (int i = 0; i < 3; i++) {
printf("%s\n", colors[i]);
}
for (String color : colors) {
System.out.println(color);
}
for (const color of colors) {
console.log(color);
}
迭代与递归的区别
递归是重复执行工作的另一种方式:一个函数针对问题的更小版本调用自己,直到遇到可以直接给出答案的情况。用其中一种写出的代码都可以改写成另一种,但它们的行为有所不同:
| 迭代 | 递归 | |
|---|---|---|
| 如何重复 | 循环跳回开头 | 函数调用自身 |
| 何时停止 | 循环条件变为假 | 到达基本情况 |
| 内存 | 无论执行多少轮,占用都相同 | 每个尚未返回的调用占用一个栈帧 |
| 典型故障 | 无限循环 | 栈溢出(Python 中是 RecursionError) |
| 适合的场景 | 列表、计数器、重复直到满足条件 | 树、嵌套数据、分治法 |
内存这一行在实践中很重要。Python 默认只允许大约 1,000 层嵌套调用,所以用递归对 5,000 个数求和会失败,而循环则毫无压力:
5050 5050
12502500
sum_recursive(5000) failed: RecursionError
递归可视化一步步展示了调用栈如何增长和收缩。
常见错误
无限循环。 条件永远不会变为假的 while 循环会一直运行,直到你手动停止程序。常见原因是忘了更新步骤,比如漏写了 count = count - 1。
差一错误。 range(1, 5) 给出的是 1、2、3 和 4,没有 5,因为结束值不包含在内。多运行一次或少运行一次的循环照样不会报错,却会给出错误的答案,这就是逻辑错误。
遍历列表时修改它。 从正在迭代的列表中删除元素,会让循环跳过一些元素:
[1, 2, 3]
有一个 2 被留了下来,因为删除第一个 2 之后,第二个 2 被挪到了循环已经走过的位置。正确的做法是构建一个新列表:numbers = [n for n in numbers if n != 2]。
下一步学什么
循环用来遍历集合,所以数组是什么是自然的配套阅读;布尔值是什么解释了决定循环何时停止的真假判断。如果循环给出了错误的结果却没有任何错误提示,可以阅读逻辑错误是什么。想练习编写循环,可以开始学习 Python 课程,或者在 Python 在线编辑器中试试上面的示例。
常见问题
迭代有哪些例子?
for 循环,会执行 100 次迭代,每个名字一次。一个不断要求输入密码、直到输入正确为止的 while 循环也是迭代,尽管它要执行多少轮事先并不知道。递归和迭代哪个更好?
总体上谈不上哪个更好。迭代使用固定数量的内存,对于求列表之和、计数这类简单的重复,通常也更快。对于本质上就是递归的问题,比如遍历文件夹树,递归写出的代码更短、更清晰,但每次调用都要占用栈内存,而在 Python 这样的语言中,递归太深就会失败。
迭代和循环是一回事吗?
for 或 while,迭代则是循环所执行的重复过程。循环体的单独一轮也叫作一次迭代,所以一个运行 5 次的循环执行了 5 次迭代。冲刺(sprint)和迭代有什么区别?
在软件项目管理中,迭代是一段固定的时间,通常为一到四周,团队在这段时间里规划、开发并评审一部分可以运行的软件。Scrum 把这段时间称为冲刺(sprint),所以实际上这两个词的意思相同。这和代码中的迭代是不同的含义。
可迭代(iterable)是什么意思?
for 遍历的对象,比如列表、字符串、字典、文件或 range。在 Python 中,只要 iter() 能从一个对象生成迭代器,这个对象就是可迭代的。整数不可迭代,所以 for x in 5: 会抛出 TypeError。