2.3 使用标志

上一节说到,Python中的while循环可以使用关键字让用户选择何时退出。实际情况是,一个循环中可能有很多结束条件,比如游戏中你的血量降为零、一局游戏的倒计时结束、你的基地被毁坏、你要营救的人质被杀害等等,这些情况只要有一个发生那么这一局游戏就宣告结束。如果将所有的条件写在while语句中,不仅非常麻烦,还影响程序的可读性和复杂性。解决办法就是使用标志。

简单来说,在程序中定义一个标志,就是告诉程序,当标志为True时继续运行,当标志为False时停止运行。通过修改上一节的程序parrot.py,我们一起学习如何使用标志。


prompt = "\nTell me something, and I'll repeat it back to you:"
prompt += "\nEnter 'quit' to end the program."
message = ""
①active = True
②while active:
    message = input(prompt)
③    if message == 'quit':
        active = False
    else:
        print(message)

①处我们将变量active设置为True,②处while循环运行的条件即为active=True,③处我们添加这样一个if条件语句:当用户输入的字符串为 'quit' 时,变量active为False,否则打印变量message中的值。程序运行结果与之前的程序parrot.py相同,但是当结束循环的条件变得非常复杂时,标志会使程序变的非常清晰明了。这便是标志的作用。

2.4 使用break退出循环

要马上退出循环,不再执行余下的代码,可使用break语句。

例如我们要让一个用户指出他曾到过哪些城市,只要当他输入字符串 'quit' 时退出循环:

cities.py


prompt = "\nPlease enter the name of a city you have visited: "
prompt += "\n(Enter 'quit' when you are finished.)"
①while True:
    city = input(prompt)
②    if city == 'quit':
        break
    else:
        print(city)

这个程序中我们首先设置提示。再设置while循环的条件为“始终为True”,也就是不停循环。但是这个程序并不会因此而无限循环,因此再while循环结构中我们加入了这样一个循环条件:当用户输入为字符串 'quit' 时则执行break,也就是结束整个循环,否则打印变量city中的值(也就是用户输入)。输出的结果是怎样的呢?


Please enter the name of a city you have visited: 
Enter 'quit' when you are finished.Beijing
Beijing
Please enter the name of a city you have visited: 
Enter 'quit' when you are finished.Shanghai
Shanghai
Please enter the name of a city you have visited: 
Enter 'quit' when you are finished.quit

可见,当我们输入城市 'Beijing' , 'Shanghai'时,程序会输出相应的城市并继续下一个循环。而当我们输入字符串 'quit' 时,循环立即停止执行。这就是break的用法:当执行break时,不再继续执行余下的循环代码并立即结束循环。

2.5 在循环中使用continue

与break类似,当执行continue时也不再执行循环结构中余下的代码,唯一不同的是整个循环结构不会停止执行,而是回到while循环最初的循环判断条件处(第一句),只要循环条件还满足则可以立即进入下一次循环。

例如,我们编写一个打印一到十以内所有奇数的程序:

continue.py


current_number = 0
while current_number < 10
①    current_number += 1
②    if current_number %2 == 0:
③        continue
    else:
        print(current_number)

首先我们将变量current_number初始值设置为0,接着在while循环中将范围设置在10以内。接着每进入一次循环变量current_number自增1。①处的if条件语句是说,当变量current_number中的值可以被2整除,也就是这个数值是偶数时运行continue,回到循环开头判断循环条件是否满足下一次循环,本次循环不再执行余下代码;否则打印处变量中的数值。运行结果为:


1

3

5

7

9


2.6 避免无限循环

当while循环条件始终结束循环时,程序就进入了无限循环状态。例如我们举一个最简单的例子,将上一个程序continue.py的while循环条件改为 "while current_number >= 0" ,那么可想而知循环条件会始终满足True,程序会无休无止的打印奇数,直到系统内存被占满:

bad_continue.py


current_number = 0
while current_number >= 0:
    current_number += 1
    if current_number %2 == 0:
        continue
    else:
        print(current_number)

程序运行结果为:


1

3

5

7

9

...

7879

7881

7883

...



程序运行以后会不停的打印每一个奇数直到程序崩溃。每一个程序员都难免会因为失误编写出无限循环,关键就在于检查循环条件设置的是否正确。当你不小心陷入无限循环时,可按Ctrl+C,也可以关闭输出的终端窗口。