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,也可以关闭输出的终端窗口。