Python 零基础教程

Python 循环控制:break 与 continue 语句

breakcontinue 语句是 Python 中控制循环流程的强大工具。

它们允许你根据特定条件改变循环的常规执行顺序,从而为你的代码带来极大的灵活性和效率。

在本章中,我们将详细探讨这两个控制流语句的用法。

1. break 语句

break 语句用于提前终止整个循环。当程序在循环体内部遇到 break 语句时,循环的执行会立即停止,程序的控制权将直接跳转到循环之后的下一条语句。

1.1 基本用法

break 最常见的使用场景是:当你在循环中找到了你要找的目标,或者达成了某个特定条件时,没有必要再继续执行后续的迭代了。

# 示例:在一个列表中查找特定的数字
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
target = 5

for number in numbers:
    print(f"正在检查数字: {number}")
    if number == target:
        print(f"找到目标: {target}")
        break  # 当找到目标时退出循环
    else:
        print(f"{number} 不是目标数字。")

print("循环结束。")

在这个例子中,循环遍历 numbers 列表。当 number 等于 target(即 5)时,break 语句被执行,循环立刻终止。程序的输出结果如下:

正在检查数字: 1
1 不是目标数字。
正在检查数字: 2
2 不是目标数字。
正在检查数字: 3
3 不是目标数字。
正在检查数字: 4
4 不是目标数字。
正在检查数字: 5
找到目标: 5
循环结束。

1.2 嵌套循环中的 break

当你将 break 语句用在嵌套循环(一个循环内部还有另一个循环)中时,它只会终止包含它的最内层循环

# 示例:跳出内层循环
for i in range(3):
    print(f"外层循环迭代: {i}")
    for j in range(5):
        print(f"  内层循环迭代: {j}")
        if j == 2:
            print("  正在跳出内层循环")
            break  # 这里只跳出最内层的 for 循环
    print("外层循环继续执行")

print("程序结束。")

输出结果:

外层循环迭代: 0
  内层循环迭代: 0
  内层循环迭代: 1
  内层循环迭代: 2
  正在跳出内层循环
外层循环继续执行
外层循环迭代: 1
  内层循环迭代: 0
  内层循环迭代: 1
  内层循环迭代: 2
  正在跳出内层循环
外层循环继续执行
外层循环迭代: 2
  内层循环迭代: 0
  内层循环迭代: 1
  内层循环迭代: 2
  正在跳出内层循环
外层循环继续执行
程序结束。

如你所见,每当 j 等于 2 时,内层循环就会被提前终止,但外层循环依然会继续它的下一次迭代。

1.3 while 循环中的 break

break 语句在 while 循环中的作用机制与在 for 循环中完全相同。

# 示例:中断 while 循环
count = 0
while True:  # 这是一个无限循环
    print(f"当前计数: {count}")
    count += 1
    if count > 5:
        print("跳出 while 循环")
        break  # 当 count 大于 5 时退出循环

print("循环结束。")

输出结果:

当前计数: 0
当前计数: 1
当前计数: 2
当前计数: 3
当前计数: 4
当前计数: 5
跳出 while 循环
循环结束。

在这个案例中,while True 创造了一个无限循环,但是 break 语句确保了当 count 超过 5 的时候,循环能够被强制终止。

2. continue 语句

continue 语句的作用是跳过当前迭代的剩余代码,并直接进入循环的下一次迭代。与 break 不同,它不会完全终止整个循环,仅仅是忽略当前这一次循环步骤中还没执行的代码。

2.1 基本用法

当你希望根据某个条件跳过循环体中的某一部分操作,但同时又想让整个循环继续往下遍历时,continue 语句非常有用。

# 示例:只打印列表中的奇数
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for number in numbers:
    if number % 2 == 0:  # 检查数字是否为偶数
        continue  # 如果是偶数,则跳过本次迭代的剩余代码
    print(f"奇数: {number}")

print("循环结束。")

输出结果:

奇数: 1
奇数: 3
奇数: 5
奇数: 7
奇数: 9
循环结束。

在这个例子中,如果 number 是偶数,continue 语句就会被执行,从而跳过那一轮的 print 语句。因此,只有奇数被打印了出来。

2.2 嵌套循环中的 continue

break 类似,如果在嵌套循环中使用 continue,它也只影响包含它的最内层循环

# 示例:在嵌套循环中使用 continue
for i in range(3):
    print(f"外层循环迭代: {i}")
    for j in range(5):
        if j == 2:
            print("  跳过内层循环的第 2 次迭代")
            continue  # 跳过内层循环当前迭代的剩余部分
        print(f"  内层循环迭代: {j}")
    print("外层循环继续执行")

print("程序结束。")

输出结果:

外层循环迭代: 0
  内层循环迭代: 0
  内层循环迭代: 1
  跳过内层循环的第 2 次迭代
  内层循环迭代: 3
  内层循环迭代: 4
外层循环继续执行
外层循环迭代: 1
  内层循环迭代: 0
  内层循环迭代: 1
  跳过内层循环的第 2 次迭代
  内层循环迭代: 3
  内层循环迭代: 4
外层循环继续执行
外层循环迭代: 2
  内层循环迭代: 0
  内层循环迭代: 1
  跳过内层循环的第 2 次迭代
  内层循环迭代: 3
  内层循环迭代: 4
外层循环继续执行
程序结束。

j 为 2 时,continue 语句跳过了内层循环中剩下的 print 语句,但是内层循环会紧接着使用下一个 j 的值继续运行。

2.3 while 循环中的 continue

while 循环中使用 continue 时需要格外小心,以防造成无限循环(死循环)。你必须确保触发 continue 的条件不会阻碍循环变量的更新,否则循环将永远无法结束。

# 示例:在 while 循环中使用 continue
count = 0
while count < 10:
    count += 1  # 注意:在检查条件之前更新计数器
    if count % 2 == 0:
        print(f"跳过偶数: {count}")
        continue  # 跳过偶数
    print(f"奇数: {count}")

print("循环结束。")

输出结果:

奇数: 1
跳过偶数: 2
奇数: 3
跳过偶数: 4
奇数: 5
跳过偶数: 6
奇数: 7
跳过偶数: 8
奇数: 9
跳过偶数: 10
循环结束。

在这个例子中,count 的自增操作(count += 1)被放在了 continue 语句的前面。这保证了即使执行了 continue,循环变量也是不断在更新的,循环最终能够正常结束。如果把 count += 1 放在 if 代码块后面的底部,那么当遇到第一个偶数时,程序会被 continue 卡住不断跳回开头,导致 count 永远无法增加,从而陷入无限循环。

3. 实际应用案例与演示

3.1 案例 1:验证用户输入

假设你正在编写一个程序,需要用户输入一系列数字。你希望确保只处理有效的数字输入,而遇到无效输入时将其跳过并重新提示。

# 示例:验证用户输入
while True:
    user_input = input("请输入一个数字(或输入 'q' 退出): ")
    
    if user_input.lower() == 'q':
        break  # 如果用户输入 'q',则退出循环
        
    try:
        number = float(user_input)  # 尝试将输入转换为浮点数
        print(f"你输入的数字是: {number}")
    except ValueError:
        print("输入无效。请输入一个有效的数字。")
        continue  # 如果输入不是数字,则跳过当前迭代,进入下一次循环

在这个案例中:

  • while True 循环会一直运行,直到用户输入 'q' 触发 break 为止。
  • try-except 代码块尝试将用户输入转换为 float 类型。
  • 如果转换失败(即输入不是有效数字),会抛出 ValueError,然后 continue 语句会直接跳过后续操作,进入下一次迭代,重新要求用户输入。
  • 如果输入有效,数字就会被正常打印出来。

3.2 案例 2:过滤数据

假设你有一个包含各种数据的列表,你只希望处理符合特定标准的数据元素。

# 示例:过滤数据
data = [10, -5, 20, -2, 0, 15, -8, 5]

for value in data:
    if value <= 0:
        continue  # 跳过非正数
    print(f"正在处理正数: {value}")

在这个案例中:

  • 循环遍历 data 列表。
  • 如果 value 是非正数(小于或等于 0),continue 语句就会跳过打印操作,循环直接前往列表的下一个元素。
  • 只有正数会被打印出来。

3.3 案例 3:寻找第一个素数

假设你想在指定的数值范围内找到出现的第一个素数(质数)。

# 示例:寻找第一个素数
def is_prime(n):
    """检查一个数字是否为素数"""
    if n <= 1:
        return False
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            return False
    return True

for number in range(2, 20):  # 检查 2 到 19 之间的数字
    if is_prime(number):
        print(f"找到的第一个素数是: {number}")
        break  # 找到第一个素数后,立刻退出循环

在这个案例中:

  • is_prime 函数用于判断数字是否为素数。
  • for 循环遍历 2 到 19。
  • 只要有一个数字被判断为素数,程序就会将其打印出来,并且利用 break 语句立刻终止循环,不再检查后面的数字。