如何在 Python 中模拟 Do-While 循环

在 Python 中实现 do-while 循环的技巧

在本教程中,我们将深入探讨如何在 Python 中模拟 do-while 循环的功能。 虽然 Python 本身没有 do-while 循环的内置支持,但我们将学习如何使用现有的循环结构和控制语句来达到相同的效果。

在任何编程语言中,循环都扮演着重要的角色,它允许我们根据特定条件重复执行一段代码。Python 提供了 while 和 for 循环,但没有直接的 do-while 循环。然而,通过巧妙地组合 Python 的现有特性,我们可以模拟出 do-while 循环的行为。让我们一起探索如何做到这一点!

什么是 do-while 循环?

如果你曾经使用过 C 或 C++ 这样的编程语言,你可能已经接触过 do-while 循环。在 do-while 循环中,循环体内的代码块(由花括号包围)会先执行一次,然后才检查循环条件。这种先执行后判断的机制使得循环体至少会被执行一次,即使循环条件一开始就不满足。

考虑下面的 C 代码示例,你可以在 techblik.com 的在线 C 编译器中直接运行它:

  //do_while_example1
  #include <stdio.h>
  int main() {
    int count = 1;
    printf("Do-While loop: \n");
    do{
        printf("Loop runs...");
        }while(count<0);
        return 0;
  }
  

代码输出如下:

  Output
  Do-While loop: 
  Loop runs...
  
  • 在这个例子中,变量 count 初始化为 1,而循环条件是 count < 0。尽管循环条件一开始就不成立(False),循环体仍然执行了一次。
  • 这与 while 循环形成对比,while 循环只有在条件为真时才会执行循环体。
  //while_example1
  #include <stdio.h>
  int main() {
    int count = 1;
    printf("While loop: \n");
    while(count<0){
        printf("Loop runs...");
      }
      return 0;
    }
  

正如我们所看到的,循环条件 count < 0 为 False,且 count 初始化为 1,所以上述 while 循环体内的代码没有执行。

    Output
    While loop: 
    //loop body does not run!
  

while 循环与 do-while 循环:比较

让我们更仔细地看看 while 循环和 do-while 循环之间的关键区别。

考虑以下示例:

  //do_while_example2
  #include <stdio.h>
  int main() {
    int count = 1;
    printf("Do-while loop: \n");
      do{
          printf("%d\n",count);
          count++;
      }while(count<5);
      return 0;
    }
  

这段代码:

  • 将变量 count 初始化为 1。
  • 使用 do-while 循环。
  • 每次循环迭代时,count 递增 1,循环条件为 count < 5

下图显示了 do-while 循环的执行过程,循环条件被检查了四次。

    Output
    Do-while loop: 
    1
    2
    3
    4
  

如果使用 while 循环,代码将如下所示:

    //while_example2
    #include <stdio.h>
    int main() {
      int count = 1;
      printf("While loop: \n");
        while(count<5){
            printf("%d\n",count);
            count++;
        };
        return 0;
      }
    

下图展示了 while 循环的执行过程,其中循环条件被检查了五次。

    Output
    While loop: 
    1
    2
    3
    4
  

虽然以上 while 和 do-while 循环的输出相同,但它们之间存在一些微妙的差别。

在 while 循环中,首先检查条件,然后执行循环体。如果循环需要运行 K 次,则循环条件必须为 True,且恰好运行 K 次。在第 K+1 次迭代时,条件变为 False,控制跳出循环。

另一方面,在 do-while 循环中,只有在循环体执行 K 次后,才在第 K 次检查循环条件。

那么,为什么这种细微的差异会有帮助呢? 🤔

假设循环条件的计算量很大,例如涉及递归函数调用或复杂的数学运算等。在这种情况下,如果循环体需要重复执行 K 次,那么使用 do-while 循环可能更有益。

while 循环和 do-while 循环的总结

让我们用表格的形式总结一下主要的区别。 👩‍🏫

While 循环 Do-While 循环
循环体执行前检查循环条件 循环体执行后检查循环条件
如果初始条件为 False,则不执行循环体 如果初始条件为 False,则循环体只执行一次
循环条件检查 K 次,K 为循环次数 循环条件检查 K-1 次,K 为循环次数
何时使用 while 循环?
– 只要条件为 True,循环就应该运行
– 用于入口控制循环
– 当循环条件计算量不高时
何时使用 do-while 循环?
– 对于最初为 False 的循环条件,循环应至少运行一次
– 用于退出控制循环
– 当循环条件计算量大时

在 Python 中模拟 do-while 循环的行为

在上一节中,我们总结了模拟 do-while 循环的两个关键条件:

  • 循环体中的代码至少需要执行一次,无论循环条件是 True 还是 False。
  • 在执行循环体中的代码后,需要检查条件。如果条件为 False,则控制流应该跳出循环(退出控制)。

Python 中的无限 while 循环和 break 语句

你可以在 Python 中定义一个无限 while 循环,如下所示:

  while True:
      pass
  # 你也可以使用任何始终为真的条件
  while always-True-condition:
    pass
  

break 语句可以用来跳出循环体,并将控制转移到循环体之后的下一条语句。

  while <condition>:
      if <some-condition>:
          break
    

在 C 语言的第一个 do-while 循环示例中,继续循环的条件是 count < 0。因此,跳出循环的条件是 count 的值大于等于零 (count >= 0)。

这是在 Python 中模拟 do-while 循环的方式:

  count = 1
  while True:
      print("Loop runs...")
      if(count >= 0):
        break
    

Python do-while 循环示例

现在,我们将重新审视上一节中的示例,并使用 Python 模拟 do-while 循环来重写它们。

#1. 让我们回顾一下这个例子:当 count 小于 5 时,打印出变量 count 的值。

我们已经知道如何定义一个无限循环,以便循环体至少执行一次。

只要 count 小于 5,循环就应该继续。因此,当 count 达到 5 时,我们应该跳出循环。所以 count == 5 是退出条件。

综合起来,代码如下:

  count = 1
  while True:
    print(f"Count is {count}")
    count += 1
    if count==5:
      break
  
  Output
  Count is 1
  Count is 2
  Count is 3
  Count is 4
  

#2. 我们还可以用 Python 的 do-while 结构来重新实现猜数字游戏。

在猜数字游戏中,我们需要验证用户的猜测是否与预先定义的秘密数字匹配。用户应该在最大尝试次数内(例如 max_guesses)猜出这个秘密数字。

代码应该提示用户输入,并根据其猜测是否正确给出反馈。我们可以使用无限的 while 循环来实现这一点。

那么,我们应该什么时候跳出循环呢?

当出现以下任何一种情况时,控制流应该跳出循环:

  • 当用户猜对数字时。
  • 当用户还没有猜对数字,但已经用完了所有的猜测次数。用户错误猜测的次数 = max_guesses。

下面的代码展示了如何做到这一点。

  import random

  low, high = 5,50

  secret_number = random.choice(range(low,high))

  max_guesses = 10

  num_guesses = 0

  while True:
      guess = int(input("\nGuess a number:"))
      num_guesses += 1
      
      conditions = [num_guesses==max_guesses,guess==secret_number]
      
      if any(conditions):
        break
  

我们可以在满足上述每个条件时添加解释性的 print() 语句,然后跳出循环,而不是直接跳出循环。

    import random

    low, high = 5,50
  
    secret_number = random.choice(range(low,high))
  
    print(secret_number)
  
    max_guesses = 10
  
    num_guesses = 0
  
    while True:
        guess = int(input("\nGuess a number:"))
        num_guesses += 1
    
        if guess==secret_number:
            print("Congrats, you guessed it right!")
            break
        if num_guesses==max_guesses:
            print("Sorry, you have no more guesses left!")
            break
    

下面展示了两个示例输出。

在这个示例输出中,当用户正确猜出密码时,break 语句会跳出循环。

# 当 secret_number = 43 且用户猜对时的示例输出
Guess a number:4
Guess a number:3
Guess a number:43
Congrats, you guessed it right!

当用户已经用尽所有的猜测机会,但未能正确猜出密码时的示例输出。

# 当 secret_number = 33 且用户未能猜对时的示例输出
Guess a number:3
Guess a number:15
Guess a number:21
Guess a number:50
Guess a number:17
Guess a number:6
Guess a number:18
Guess a number:5
Guess a number:12
Guess a number:43
Sorry, you have no more guesses left!

结论

希望本教程能帮助你了解如何在 Python 中模拟 do-while 循环。

以下是重点:

  • 使用无限循环来保证循环体至少执行一次。它可以是普通的无限循环,例如 while True,或者使用 while <condition>,其中 <condition> 始终为 True。
  • 检查循环内的退出条件,并在满足特定条件时使用 break 语句跳出循环。

接下来,学习如何在 Python 中使用 for 循环和 enumerate() 函数。