循环结构用于重复执行同一段代码。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) # 总和是 48range():生成数字序列
若仅需固定次数的迭代,可使用 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 4range(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 jazzfor ... 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。