Skip to content

12|循环语句

循环让程序重复执行一段代码。Python 提供两种循环:for 用于遍历序列,while 用于条件循环。配合 breakcontinueelse,可以精确控制循环行为。

一、for 循环

for 遍历序列中的每个元素:

python
names = ["Alice", "Bob", "Charlie"]

for name in names:
    print(f"你好, {name}")

遍历字符串:

python
for char in "hello":
    print(char)

遍历字典:

python
scores = {"Alice": 85, "Bob": 92, "Charlie": 78}

for name in scores:           # 遍历键
    print(name)

for score in scores.values(): # 遍历值
    print(score)

for name, score in scores.items():  # 遍历键值对
    print(f"{name}: {score}")

二、while 循环

while 在条件为真时持续循环:

python
count = 0
while count < 5:
    print(count)
    count += 1

while 适合不知道循环次数的场景:

python
# 读取用户输入直到输入 quit
while True:
    line = input("> ")
    if line == "quit":
        break
    print(f"输入: {line}")

while True 配合 break 是常见模式。循环体内部决定何时退出,比把退出条件写在 while 后面更灵活。

三、break 与 continue

break 立即终止整个循环:

python
for num in range(100):
    if num > 10:
        break
    print(num)
# 输出 0 到 10,然后终止

continue 跳过当前迭代,继续下一个:

python
for num in range(10):
    if num % 2 == 0:
        continue
    print(num)
# 输出 1, 3, 5, 7, 9,跳过偶数

breakcontinue 只影响最内层循环:

python
for i in range(3):
    for j in range(3):
        if j == 1:
            break      # 只跳出内层 j 循环,外层 i 循环继续
        print(i, j)

四、循环的 else 子句

循环后面可以带 else,它在循环正常结束(没有被 break)时执行:

python
for num in range(2, 10):
    for i in range(2, num):
        if num % i == 0:
            break      # 找到因数,不是质数
    else:
        print(num)     # 没有被 break,是质数

输出 2 到 9 中的质数:2, 3, 5, 7。

else 属于循环结构,不是 if。这个语法容易让人困惑——可以把 else 理解为"如果没有被 break"。

五、enumerate 与 zip

需要索引时,用 enumerate()

python
names = ["Alice", "Bob", "Charlie"]

for index, name in enumerate(names):
    print(f"{index}: {name}")
# 0: Alice
# 1: Bob
# 2: Charlie

# 指定起始索引
for index, name in enumerate(names, start=1):
    print(f"{index}: {name}")
# 1: Alice
# 2: Bob
# 3: Charlie

同时遍历多个序列,用 zip()

python
names = ["Alice", "Bob", "Charlie"]
scores = [85, 92, 78]

for name, score in zip(names, scores):
    print(f"{name}: {score}")

zip() 以最短的序列为准:

python
a = [1, 2, 3]
b = ["a", "b"]
list(zip(a, b))   # [(1, 'a'), (2, 'b')]

需要处理不等长序列时,用 itertools.zip_longest()

python
from itertools import zip_longest

list(zip_longest(a, b, fillvalue="N/A"))
# [(1, 'a'), (2, 'b'), (3, 'N/A')]

六、range 与循环

需要按数字计数时,range() 配合 for

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

for i in range(1, 6):
    print(i)        # 1, 2, 3, 4, 5

for i in range(0, 10, 2):
    print(i)        # 0, 2, 4, 6, 8

for i in range(10, 0, -1):
    print(i)        # 10, 9, ..., 1

记忆锚点for 遍历序列,while 条件循环;break 终止整个循环,continue 跳过当前迭代;循环的 else 在没被 break 时执行;enumerate() 同时获取索引和元素;zip() 并行遍历多个序列,以最短的为准;range(5) 生成 0-4,range(1, 6) 生成 1-5。