小白编程
亮色模式 暗色模式 跟随系统
首页 Python

如何在 Python 中使用 while 循环

发布日期:

在 Python 编程中,for 循环通常用于遍历一个集合中的每一个元素并执行相应的代码块。而 while 循环则不同,它会在指定条件为真时持续执行一段代码块,直到该条件不再满足为止。

使用 while 循环

我们可以通过一个简单的例子来理解如何使用 while 循环进行计数。下面的例子展示了如何使用 while 循环从 1 数到 5:

1
2
3
4
current_number = 1
while current_number <= 5:
    print(current_number)
    current_number += 1

首先,在程序的第一行,我们将整数 1 赋值给变量 current_number,这表示我们的计数从数字 1 开始。接下来,while 循环会检查 current_number 是否小于或等于 5。如果这个条件成立,循环体内的代码将会被执行:打印出当前的 current_number 值,并通过 current_number += 1 (这是 current_number = current_number + 1 的简洁写法)将 current_number 的值加 1。

只要 current_number 的值不超过 5,Python 就会继续运行这个循环。例如,当 current_number 是 1 时,因为 1 小于 5,所以 Python 首先打印出 1,然后将 current_number 加 1 变成 2。接着,由于 2 仍然小于 5,Python 再次打印 2 并再次将 current_number 加 1。这一过程一直重复,直到 current_number 的值超过 5 时,循环停止。

输出结果如下所示:

1
2
3
4
5
1
2
3
4
5

你可能已经注意到,日常使用的许多程序都依赖于 while 循环。比如,在游戏中,while 循环确保游戏在用户想要继续玩的时候保持运行状态,并在玩家选择退出时终止。这样的设计保证了程序能够在用户希望结束时正确地停止,或者根据用户的操作持续运行,从而提供更好的用户体验。因此,掌握 while 循环对于编写功能丰富的程序来说是非常重要的。

让用户选择何时退出

使用 while 循环,我们可以让程序在用户希望时持续运行。以下面的程序为例,展示了如何利用 while 循环来实现这一功能,并定义了一个退出值(在这里是 'quit'),只要用户输入的内容不是这个值,程序就会一直运行。

1
2
3
4
5
6
7
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)

首先,我们定义了一条提示信息 prompt,它告诉用户有两种选择:可以输入一条消息或者输入一个特定的退出值 'quit' 来结束程序。接下来,创建变量 message 用于保存用户的输入。我们将 message 的初始值设为空字符串 "",这是为了让 Python 在首次执行 while 循环时有一个可供检查的值。

如果在第一次执行 while 语句时没有初始值,Python 将无法进行比较,因为此时用户还没有输入任何内容。因此,给 message 赋予一个初始值是必要的步骤,即使这个初始值只是一个空字符串,但它符合要求,使得 Python 可以顺利执行 while 循环所需的条件判断。

当程序首次进入循环时,由于 message 是一个空字符串,Python 会显示提示信息并等待用户输入。不论用户输入了什么内容,都会被赋值给 message 并打印出来。然后,Python 再次检查 while 循环中的条件。只要用户输入的内容不是 'quit',程序就会再次显示提示信息并等待新的输入。一旦用户输入了 'quit',程序将停止执行 while 循环,整个程序也随之结束:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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

虽然上述程序很好地实现了基本功能,但是存在一个小问题:它也将退出指令 'quit' 当作普通的消息打印了出来。为了修正这个问题,可以在打印之前添加一个简单的 if 测试:

1
2
3
4
5
6
7
8
9
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)

现在,程序会在打印消息前进行检查,只有当消息不是退出值 'quit' 时才会将其打印出来。这样就避免了将退出指令也作为普通消息输出的问题,使得程序更加合理和友好。

例如,程序运行时的交互如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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 循环以及简单的条件语句来控制程序的流程。

使用标志

在之前的示例中,我们通过检查一个特定条件(例如输入是否为 'quit')来决定程序何时停止运行。然而,在更复杂的程序中,比如游戏,可能会有多种不同的事件导致程序结束运行,如玩家失去所有生命、时间耗尽或需要保护的目标被摧毁等。在这种情况下,如果尝试在一个 while 语句中检查所有这些条件,将会变得既复杂又难以管理。

为了简化这种情况,我们可以使用一个称为 标志(flag) 的变量。这个标志就像是程序的交通信号灯,用来表示整个程序是否应该继续运行。当发生任何应停止程序运行的事件时,我们只需将标志设置为 False,而在 while 循环中仅需检查这一个标志的状态即可。这样不仅使代码更加整洁,而且也更容易扩展和维护。

接下来,我们在之前的程序中加入一个标志,名为 active(当然你可以根据喜好选择其他名称),用于判断程序是否应继续运行:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
prompt = "\nTell me something, and I will repeat it back to you:"
prompt += "\nEnter 'quit' to end the program. "

active = True  # 设置初始标志为 True,表示程序开始时处于活动状态
while active:  # 只要 active 为 True,循环就继续执行
    message = input(prompt)

    if message == 'quit':  # 如果用户输入 'quit'
        active = False  # 将标志设置为 False,导致 while 循环终止
    else:
        print(message)  # 打印用户输入的消息

在这个版本中,我们将变量 active 初始化为 True,这意味着程序一开始是处于活动状态的。这样做简化了 while 循环,因为我们不需要在循环条件中做额外的比较——所有的逻辑现在都由程序的其他部分处理。只要 active 的值保持为 True,循环就会一直运行下去。

while 循环内部,一旦获取用户的输入后,我们就用一条 if 语句检查该输入是否为 'quit'。如果是,则将 active 设置为 False,从而退出循环;如果不是,则打印出用户输入的信息。

这种方法的好处在于,它使得向程序添加新的退出条件变得非常容易。例如,如果你想检查是否有其他事件触发程序结束,你只需要在适当的位置添加相应的逻辑来修改 active 标志的值即可。这对于开发复杂的应用程序,特别是像包含许多可能的退出条件的游戏来说,是非常有用的。

当任意一个事件导致 active 变成 False 时,主游戏循环就会退出,并且可以显示一条游戏结束的消息给玩家,询问他们是否想要重新开始游戏。这种方式不仅提高了代码的可读性,还增强了程序的灵活性和可维护性。

使用 break 退出循环

当你希望无论条件测试的结果如何,都能立即退出 while 循环,并且不再执行循环中剩余的代码时,可以使用 break 语句。break 语句允许你控制程序的流程,决定哪些代码行被执行,哪些不被执行,从而确保程序按照你的期望运行。

例如,假设我们有一个程序,它让用户指出他们曾经去过哪些城市。在这个程序中,当用户输入 'quit' 后,我们可以使用 break 语句立即退出 while 循环:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
prompt = "\nPlease enter the name of a city you have visited:"
prompt += "\n(Enter 'quit' when you are finished.) "

while True:  # ❶ 以 while True 打头的循环将不断运行
    city = input(prompt)

    if city == 'quit':
        break  # 如果用户输入 'quit',则执行 break 语句,导致 Python 退出循环
    else:
        print(f"I'd love to go to {city.title()}!")

在上面的例子中,循环以 while True: 开始,这意味着如果没有遇到 break 语句,这个循环将会无限运行(见❶)。程序会不断地请求用户输入他们访问过的城市名称。如果用户输入了 'quit',则执行 break 语句,这会导致 Python 立即退出循环,程序随之结束。如果用户输入的是其他任何城市名称,则该名称会被打印出来。

以下是程序运行的一个示例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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 语句。这意味着除了 while 循环外,你还可以在遍历列表或字典的 for 循环中使用 break 来提前退出循环。

这种灵活性使得 break 成为一个强大的工具,用于根据特定条件精确地控制程序流程。通过这种方式,你可以更加精细地控制程序的行为,确保只有在满足特定条件时才继续执行某些代码块。

在循环中使用 continue

当你希望在满足特定条件时跳过当前循环的剩余部分,并立即开始下一次循环迭代,可以使用 continue 语句。与 break 语句不同,break 会完全退出循环,而 continue 则允许你根据条件测试的结果决定是否继续执行当前循环的剩余代码。

例如,假设我们想要编写一个程序,它从 1 数到 10 并只打印奇数。我们可以使用 while 循环结合 continue 语句来实现这一目标:

1
2
3
4
5
6
7
current_number = 0
while current_number < 10:
    current_number += 1  # ❶ 以步长为 1 的方式往上数
    if current_number % 2 == 0:  # 检查 current_number 是否能被 2 整除
        continue  # 如果是偶数,则忽略本次循环剩下的代码,返回循环开头

    print(current_number)  # 打印不是偶数的数字(即奇数)

首先,我们将 current_number 初始化为 0。由于这个值小于 10,Python 开始执行 while 循环。每次循环迭代中,都会将 current_number 增加 1(见❶)。然后,通过 if 语句检查 current_number 是否能被 2 整除(即求模运算 current_number % 2 == 0 是否成立)。

如果结果为 True(意味着 current_number 是偶数),则执行 continue 语句,这使得 Python 忽略循环体中 continue 之后的所有代码,并直接进入下一次循环迭代。如果 current_number 不能被 2 整除(即它是奇数),则执行 print() 函数,打印该数字。

以下是程序运行的结果:

1
2
3
4
5
1
3
5
7
9

这段代码展示了如何使用 continue 来控制循环流程。在这个例子中,每当遇到偶数时,continue 语句就让程序跳过当前迭代的剩余部分,直接开始下一次迭代。这样,只有当 current_number 是奇数时,才会执行 print() 函数,从而实现了只打印奇数的目的。

这种技术对于需要基于某些条件过滤数据的情况特别有用,它可以让你更灵活地控制循环的行为。

避免无限循环

每个 while 循环都必须有一个明确的退出条件,以确保循环不会无止境地运行。如果在编写 while 循环时没有提供正确的退出途径,可能会导致程序陷入无限循环,这不仅会消耗系统资源,还可能导致程序无法正常结束。

例如,下面是一个正确的循环示例,它从 1 数到 5:

1
2
3
4
x = 1
while x <= 5:
    print(x)
    x += 1  # 增加 x 的值,确保循环最终能够结束

在这个例子中,变量 x 初始设置为 1,并在每次循环迭代中增加 1。这意味着当 x 超过 5 时,条件 x <= 5 将不再满足,循环也会随之终止。

但是,如果我们不小心遗漏了 x += 1 这一行代码,就像下面这样:

1
2
3
4
# 这个循环将没完没了地运行!
x = 1
while x <= 5:
    print(x)

在这个修改后的版本中,由于缺少了使 x 值变化的代码行,x 的值将始终保持为 1。因此,条件 x <= 5 永远为 True,导致 while 循环不断打印 1,形成一个无限循环:

1
2
3
4
5
1
1
1
1
--snip--

为了避免这种情况,每位程序员都需要仔细检查自己的 while 循环逻辑,确保至少有一个机制可以使循环条件变为 False 或者执行 break 语句来退出循环。如果你怀疑自己编写的循环可能成为无限循环,可以通过以下步骤进行测试:

  • 手动测试: 运行程序并输入预期可以终止循环的值或条件,观察程序是否如预期那样停止。
  • 检查逻辑: 确认你的程序至少有一个地方能使循环条件变为 False 或者包含了一个能被执行的 break 语句。

如果你的程序不幸陷入了无限循环,可以通过按 Ctrl + C 来中断程序的执行,或者关闭显示程序输出的终端窗口。对于许多代码编辑器(比如 VS Code),你可以在输出区域中单击鼠标,然后按 Ctrl + C 来终止无限循环。

相关文章