循环结构用于重复执行同一段代码。Python 提供 for(按可迭代对象逐项处理)与 while(在条件为真时重复执行)两种形式。二者均可附带 else 子句,在循环未被 break 打断而正常结束时执行。本节说明 for、range、索引遍历、while 及循环 else 的语义与选用原则。

for:遍历序列

for 依次从可迭代对象(列表、字符串、元组、字典等)中取出每一项:

numbers = [6, 5, 3, 8, 4, 2, 5, 4, 11]
total = 0
for val in numbers:
    total = total + val
print("总和是", total)   # 总和是 48

range():生成数字序列

若仅需固定次数的迭代,可使用 range 生成整数序列,而不必事先构造列表:

Python range 生成数列示例运行
print(list(range(10)))         # [0,1,2,3,4,5,6,7,8,9]
print(list(range(2, 8)))       # [2,3,4,5,6,7]
print(list(range(2, 20, 3)))   # [2,5,8,11,14,17]

for i in range(5):
    print(i, end=" ")          # 0 1 2 3 4

range(start, stop, step) 中,start 默认为 0,step 默认为 1,生成的序列不包含 stop 本身。

用索引遍历 + len()

genre = ['pop', 'rock', 'jazz']
for i in range(len(genre)):
    print("I like", genre[i])

输出:

I like pop
I like rock
I like jazz

for ... else

循环完整执行完毕且中途未执行 break 时,会进入 else 块:

digits = [0, 1, 5]
for i in digits:
    print(i)
else:
    print("没有剩余的项目")

输出:

0
1
5
没有剩余的项目

在查找场景中:若在循环内找到目标并 break,则跳过 else。若遍历结束仍未找到,则执行 else 中的未命中处理:

marks = {'James': 90, 'Jules': 55, 'Arthur': 77}
student_name = 'Soyuj'

for student in marks:
    if student == student_name:
        print(marks[student])
        break
else:
    print('没有找到该名称的条目')

while:条件成立则循环

当迭代次数事先不确定时,可使用 while:条件为真则进入循环体,执行完毕后再重新判断条件:

n = 10
total = 0
i = 1
while i <= n:
    total = total + i
    i = i + 1
print("1+2+...+10 =", total)   # 55

须在循环体内更新影响条件的变量(例如 i = i + 1)。若遗漏更新,条件可能恒为真,从而形成死循环。

开始条件?真循环体假循环后代码结束

while 循环流程:先判断条件,为真进入循环体,跑完回到条件再判断

while ... else

条件变为 False、循环自然结束时执行 else。若中途被 break 终止,则不执行 else:

counter = 0
while counter < 3:
    print("内部循环")
    counter = counter + 1
else:
    print("else 语句")

输出:

内部循环
内部循环
内部循环
else 语句

for 还是 while?

场景用哪个
遍历列表 / 字符串 / 固定次数for
直到某条件满足才停(次数未知)while
持续循环直至外部条件触发退出while True 配合 break

练习建议

使用 for 计算 1 至 100 的整数和。另编写 while 累计程序:反复读入整数,读入 0 时结束并输出累计和。

小结

for 适合遍历序列或配合 range 固定次数。while 适合终止条件事先不确定的情形。使用 while 时须确保循环变量或条件能在迭代中向假方向变化,以免形成死循环。

本节说明了两种循环及 else 子句的语义。下一节讲解break 与 continue。