3.4.3 循环的非正常中断

正常的循环总是按“从头到尾再回到头”的方式进行的,但是很多编程语言都提供了在特定条件下打破正常循环方式的语句,目的是在某些情况下可以编写更简单的代码。Python 语言中也提供了这样的语句:break 和 continue。

break 语句

for 或 while 语句的循环体中可以使用 break 语句,其效果是终止本次循环,并将控制跳 出循环语句,转到循环语句的下一条语句。

break 语句经常与一个无穷循环搭配使用,因为按正常途径是跳不出无穷循环的,而用 break 则能以非正常方式跳出循环。例如,我们换一种方法来实现“输入合法性检查”,代码 如下:

  1. >>> while True:
  2. x = input("Please input a positive number: ")
  3. if x > 0:
  4. break
  5. Please input a positive number: -2
  6. Please input a positive number: 0
  7. Please input a positive number: 2
  8. >>>

这里循环条件是常量 True,它的值是不可能被循环体改变的,即永远为真,所以这是一个无 穷循环①。与前面用后测试循环实现的输入合法性检查代码相比较,可以看到这段代码不需 要人为设置循环的初始条件为 True,因为循环体总是要执行的。这样的代码更加简单直观, 但问题是如何退出无穷循环呢?从上面的代码可见,当用户输入数据不正确,就会不断循环, 要求用户重新输入;当用户确实输入了正数 x,就会执行 break 语句,其作用是跳出循环,控 制转到下一条语句(通常是接着对合法的输入数据 x 进行处理的代码)。

再看一个用 break 跳出 for 循环的例子:

  1. >>> for i in range(10):
  2. print "烦"
  3. if i > 4:
  4. break

从代码可见,虽然 for 语句本身说的是要罚写 10 遍“烦”字,但循环体中却另有安排:如果 已经抄写了 6 遍(思考:为什么是 6 遍?颠倒循环体中两条语句的顺序又会如何?)“烦”字 后,就不耐烦地跳出了循环。

① 由于 1 在很多语言中都解释为 True,所以有很多人喜欢用 while 1 来表示无穷循环。

利用无穷循环和 break 搭配的结构同样可以实现前面介绍的哨兵循环,一般模式如下:

  1. while True:
  2. 输入下一个数据 x
  3. if x 是哨兵:
  4. break
  5. 处理 x

与哨兵循环模式相比较,就能看出这种模式不需要循环之前的前导输入,但在循环体中必须 用 break 才能退出循环。

continue 语句

for 或 while 语句的循环体中还可以使用 continue 语句,其作用是终止本次循环,并将控 制转到循环语句的开始处,“继续”执行下一次循环。

对 break 与 continue 语句进行比较,可知两者都终止执行当前循环,但接着 break 会跳出 循环语句,而 continue 则继续下一次循环。

看一个简单例子:对数据列表中的奇数求和。算法很简单,只需逐个检查列表中的数据, 如果是奇数就加到总和上,如果是偶数就忽略之,直接去检查下一个数据。代码如下:

  1. >>> a = [23,28,39,44,50,67,99]
  2. >>> sum = 0
  3. >>> for i in a:
  4. if a % 2 == 0:
  5. continue
  6. sum = sum + i
  7. >>> print sum
  8. 228

要说明的是,break 和 continue 语句导致循环结构有多个出口,这不符合结构化编程的基 本思想。虽然使用它们没什么大问题,但仍然建议读者尽量避免使用,尤其是不宜在一个循 环体中使用多个 break 或 continue 语句。关于结构化编程,详见 3.5 节。