while循环简介
for 循环采用项目集合并为集合中的每个项目执行一次代码块。 相比之下,while 循环只要或 while 某个条件为真就会运行。
使用while循环
您可以使用 while 循环来计算一系列数字。 例如,以下 while 循环从 1 计数到 5:
current_number = 1
while current_number <= 5:
print(current_number)
current_number += 1
在第一行中,我们通过为 current_number 赋值 1 从 1 开始计数。然后将 while 循环设置为只要 current_number 的值小于或等于 5 就一直运行。循环内的代码打印值 current_number 然后用 current_number += 1
将该值加 1。(+=
运算符是 current_number = current_number + 1 的简写。)
只要条件 current_number <= 5
为真,Python 就会重复循环。 因为 1 小于 5,Python 打印 1 然后加 1,使当前数为 2。因为 2 小于 5,Python 打印 2 并再次加 1,使当前数为 3,依此类推。 一旦 current_number 的值大于5,循环停止运行,程序结束:
1
2
3
4
5
您每天使用的程序很可能包含 while 循环。 例如,一个游戏需要一个 while 循环来保持运行,只要你想继续玩,所以它可以在你要求退出时立即停止运行。 如果程序在我们告诉它们停止运行之前停止运行,或者即使在我们想要退出后仍继续运行,那么它们使用起来就不会很有趣,所以 while 循环非常有用。
让用户选择何时退出
我们可以通过将大部分程序放在 while 循环中,让 parrot.py 程序运行到用户想要的时间。 我们将定义一个退出值,然后只要用户没有输入退出值,程序就会一直运行:
prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "
message = ""
while message != 'quit':
message = input(prompt)
print(message)
我们首先定义一个提示,告诉用户他们的两个选项:输入消息或输入退出值(在本例中为“退出”)。 然后我们设置一个变量消息来跟踪用户输入的任何值。 我们将消息定义为空字符串“”,因此 Python 在第一次到达 while 行时需要检查一些内容。 程序第一次运行并且 Python 到达 while 语句时,它需要将 message 的值与 'quit' 进行比较,但是还没有用户输入。 如果 Python 没有什么可以比较的,它就无法继续运行程序。 为了解决这个问题,我们确保给消息一个初始值。 虽然它只是一个空字符串,但它对 Python 有意义并允许它执行使 while 循环工作的比较。 只要消息的值不是“退出”,这个 while 循环就会运行。
第一次循环时,message 只是一个空字符串,所以 Python 进入了循环。 在 message = input(prompt) 处,Python 显示提示并等待用户输入。 无论他们输入什么,都会分配给消息并打印出来; 然后,Python 重新评估 while 语句中的条件。 只要用户没有输入“quit”这个词,就会再次显示提示,Python 会等待更多的输入。 当用户最终输入“退出”时,Python 停止执行 while 循环,程序结束:
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Hello everyone!
Hello everyone!
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Hello again.
Hello again.
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. quit
quit
这个程序运行良好,除了它打印“退出”这个词,就好像它是一条真实的消息一样。 一个简单的 if 测试解决了这个问题:
prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "
message = ""
while message != 'quit':
message = input(prompt)
if message != 'quit':
print(message)
现在程序在显示消息之前进行快速检查,并且仅在消息与退出值不匹配时才打印消息:
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Hello everyone!
Hello everyone!
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. Hello again.
Hello again.
Tell me something, and I will repeat it back to you:
Enter 'quit' to end the program. quit
使用标志
在前面的示例中,我们让程序在给定条件为真时执行某些任务。 但是,如果有许多不同的事件可能导致程序停止运行的更复杂的程序呢?
例如,在游戏中,几个不同的事件可以结束游戏。 当玩家用完船只,他们的时间用完,或者他们应该保护的城市全部被摧毁时,游戏应该结束。 如果这些事件中的任何一个发生,它就需要结束。 如果可能发生许多可能的事件以停止程序,则试图在一个 while 语句中测试所有这些条件变得复杂和困难。
对于只应在许多条件为真时运行的程序,您可以定义一个变量来确定整个程序是否处于活动状态。 这个变量称为标志,充当程序的信号。 我们可以编写我们的程序,使它们在标志设置为 True 时运行,并在多个事件中的任何一个将标志的值设置为 False 时停止运行。 因此,我们的整体 while 语句只需要检查一个条件:标志当前是否为 True。 然后,我们所有其他测试(查看是否发生了应将标志设置为 False 的事件)都可以整齐地组织在程序的其余部分中。
让我们向上一节的 parrot.py 添加一个标志。 这个标志,我们称之为 active(尽管你可以称它为任何东西),将监控程序是否应该继续运行:
prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "
active = True
while active: (1)
message = input(prompt)
if message == 'quit':
active = False
else:
print(message)
1 | 我们将变量 active 设置为 True,以便程序以活动状态启动。 这样做会使 while 语句更简单,因为 while 语句本身不进行比较; 逻辑在程序的其他部分得到处理。 只要活动变量保持为 True,循环就会继续运行。 |
在 while 循环内的 if 语句中,一旦用户输入,我们就会检查 message 的值。 如果用户输入“quit”,我们将 active 设置为 False,while 循环停止。 如果用户输入除“退出”以外的任何内容,我们会将他们的输入打印为一条消息。
该程序的输出与前面的示例相同,我们将条件测试直接放在 while 语句中。 但是既然我们有了一个标志来指示整个程序是否处于 active 状态,那么对于应该导致 active 变为 False 的事件添加更多的测试(例如 elif 语句)就很容易了。 这在像游戏这样的复杂程序中很有用,在这些程序中可能有许多事件都应该使程序停止运行。 当这些事件中的任何一个导致 active 标志变为 False 时,主游戏循环将退出,可以显示 Game Over 消息,并且玩家可以选择再次玩游戏。
使用break退出循环
要立即退出 while 循环而不运行循环中的任何剩余代码,而不考虑任何条件测试的结果,请使用 break 语句。 break 语句指导程序的流程; 你可以用它来控制哪些代码行被执行,哪些不被执行,这样程序就只在你想要的时候执行你想要它执行的代码。
例如,考虑一个询问用户他们去过的地方的程序。 我们可以通过在用户输入 "quit" 值时立即调用 break 来停止此程序中的 while 循环:
prompt = "\nPlease enter the name of a city you have visited:"
prompt += "\n(Enter 'quit' when you are finished.) "
while True: (1)
city = input(prompt)
if city == 'quit':
break
else:
print(f"I'd love to go to {city.title()}!")
1 | 除非遇到 break 语句,否则以 while True 开头的循环将永远运行下去。 该程序中的循环继续要求用户输入他们去过的城市名称,直到他们输入“退出”。 当他们输入“quit”时,break 语句运行,导致 Python 退出循环: |
Please enter the name of a city you have visited:
(Enter 'quit' when you are finished.) New York
I'd love to go to New York!
Please enter the name of a city you have visited:
(Enter 'quit' when you are finished.) San Francisco
I'd love to go to San Francisco!
Please enter the name of a city you have visited:
(Enter 'quit' when you are finished.) quit
您可以在任何 Python 循环中使用 break 语句。 例如,您可以使用 break 退出正在遍历列表或字典的 for 循环。 |
在循环中使用continue
您可以根据条件测试的结果,使用 continue 语句返回到循环的开头,而不是完全退出循环而不执行循环的其余代码。 例如,考虑一个从 1 数到 10 但只打印该范围内的奇数的循环:
current_number = 0
while current_number < 10:
current_number += 1 (1)
if current_number % 2 == 0:
continue
print(current_number)
1 | 首先,我们将 current_number 设置为 0。因为它小于 10,Python 进入 while 循环。 一旦进入循环,我们将计数递增 1,因此 current_number 为 1。然后 if 语句检查 current_number 和 2 的模数。如果模数为 0(这意味着 current_number 可以被 2 整除),continue 语句告诉 Python 忽略循环的其余部分并返回到开头。 如果当前数字不能被 2 整除,则执行循环的其余部分并且 Python 打印当前数字: |
1
3
5
7
9
避免无限循环
每个 while 循环都需要一种停止运行的方法,这样它就不会永远运行下去。 例如,这个计数循环应该从 1 数到 5:
current_number = 1
while current_number <= 5:
print(current_number)
current_number += 1
但是,如果您不小心省略了 x += 1
行,循环将永远运行下去:
# This loop runs forever!
x = 1
while x <= 5:
print(x)
现在 x 的值将从 1 开始但永远不会改变。 结果,条件测试 x <= 5
将始终评估为 True 并且 while 循环将永远运行,打印一系列 1,如下所示:
1
1
1
1
--snip--
每个程序员都会时不时地不小心编写一个无限的 while 循环,尤其是当程序的循环有微妙的退出条件时。 如果您的程序陷入无限循环,请按 CTRL-C 或关闭显示程序输出的终端窗口。
为避免编写无限循环,请测试每个 while 循环并确保循环在您期望的时候停止。 如果您希望您的程序在用户输入某个输入值时结束,请运行该程序并输入该值。 如果程序没有结束,请仔细检查程序处理应导致循环退出的值的方式。 确保程序的至少一部分可以使循环的条件为 False 或使其到达 break 语句。
与许多编辑器一样,VS Code 在嵌入式终端窗口中显示输出。 要取消无限循环,请确保在按 CTRL-C 之前单击编辑器的输出区域。 |