3.4.3 循环的非正常中断

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

break 语句

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

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

>>> while True:
        x = input("Please input a positive number: ") 
        if x > 0: 
            break
Please input a positive number: -2 
Please input a positive number: 0 
Please input a positive number: 2
>>>

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

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

>>> for i in range(10):
        print "烦"
        if i > 4: 
            break
烦 烦 烦 烦 烦 烦

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

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

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

while True:
    输入下一个数据 x
    if x 是哨兵: 
        break
    处理 x

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

continue 语句

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

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

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

>>> a = [23,28,39,44,50,67,99]
>>> sum = 0
>>> for i in a:
        if a % 2 == 0: 
            continue 
        sum = sum + i
>>> print sum
228

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