So emulieren Sie Do-While-Schleifen in Python

Die Emulation der Do-While-Schleife in Python

Dieses Tutorial zeigt Ihnen, wie Sie das Verhalten einer Do-While-Schleife in Python nachbilden können.

Schleifen sind ein fundamentales Konzept in der Programmierung, um Codeblöcke wiederholt auszuführen. Python bietet die while– und for-Schleifen, jedoch keine direkte Implementierung der Do-While-Schleife.

Dennoch ist es möglich, eine Do-While-Schleife zu emulieren, indem man ihre Funktionsweise versteht und die vorhandenen Kontrollstrukturen von Python geschickt einsetzt.

In den folgenden Abschnitten werden wir uns genauer damit beschäftigen, wie dies umgesetzt werden kann. Beginnen wir!

Was ist eine Do-While-Schleife?

Wenn Sie Erfahrung mit Programmiersprachen wie C oder C++ haben, ist Ihnen das Konzept der Do-While-Schleife wahrscheinlich bereits bekannt.

Bei einer Do-While-Schleife wird der Codeblock im Schleifenkörper, der durch geschweifte Klammern begrenzt ist, zuerst ausgeführt. Erst dann wird die Schleifenbedingung überprüft.

Die folgenden C-Beispiele können Sie direkt in einem Online-C-Compiler wie dem von wdzwdz in Ihrem Browser testen.

Betrachten Sie den nachfolgenden Code:

    //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;
    }
  

Die zugehörige Ausgabe:

    Output
    Do-While loop:
    Loop runs...
  

In diesem Beispiel:

  • Die Variable count ist auf 1 gesetzt, während die Schleifenbedingung count < 0 lautet. Die Schleife wird einmal ausgeführt, obwohl die Bedingung zunächst falsch ist.
  • Dies unterscheidet sich von einer while-Schleife, die nur dann ausgeführt wird, wenn die Bedingung zu Beginn wahr ist.
    //while_example1
    #include <stdio.h>
    int main() {
        int count = 1;
        printf("While loop: n");
        while(count<0){
            printf("Loop runs...");
        }
        return 0;
    }
  

Wie bereits erwähnt, ist die Bedingung count < 0 falsch. Die Variable count wird mit 1 initialisiert. Wenn wir diesen Code kompilieren und ausführen, wird die Anweisung im while-Schleifenkörper nicht ausgeführt.

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

While vs. Do-While: Ein Vergleich

Lassen Sie uns die Unterschiede zwischen while– und do-while-Schleifen genauer betrachten.

Hier ein weiteres Beispiel:

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

In diesem Code:

  • Die Variable count wird mit 1 initialisiert.
  • Eine do-while-Schleife wird verwendet.
  • Die Variable count wird in jedem Durchlauf erhöht, und die Schleifenbedingung lautet count < 5.

Die folgende Grafik veranschaulicht den Ablauf der Ausführung: Die do-while-Schleife führt den Code aus und prüft die Bedingung viermal.

    Output
    Do-while loop:
    1
    2
    3
    4
  

Die Verwendung einer while-Schleife würde zu folgendem Code führen:

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

Die folgende Abbildung zeigt den Ablauf der Ausführung der while-Schleife; in diesem Beispiel prüft die while-Schleife die Bedingung fünfmal.

    Output
    While loop:
    1
    2
    3
    4
  

Obwohl die Ausgaben der while– und do-while-Schleifen identisch sind, gibt es feine Unterschiede.

In einer while-Schleife wird die Bedingung zuerst geprüft, bevor der Schleifenkörper ausgeführt wird. Um die Schleife K-mal auszuführen, muss die Bedingung K-mal wahr sein. Beim K+1-ten Durchlauf wird die Bedingung falsch und die Schleife wird beendet.

Bei einer do-while-Schleife wird die Bedingung erst beim K-ten Mal geprüft, nachdem die Schleife K-mal durchlaufen wurde.

Warum ist diese Feinheit relevant? 🤔

Nehmen wir an, die Schleifenbedingung ist rechenintensiv, z.B. durch einen Aufruf einer rekursiven Funktion oder einer komplexen mathematischen Operation.

In solchen Fällen wäre es für K Wiederholungen des Schleifenkörpers vorteilhafter, eine do-while-Schleife zu verwenden.

Zusammenfassung: While vs. Do-While

Die wichtigsten Unterschiede sind hier zusammengefasst. 👩‍🏫

While-Schleife Do-While-Schleife
Überprüfung der Schleifenbedingung: Vor der Ausführung des Schleifenkörpers Überprüfung der Schleifenbedingung: Nach der Ausführung des Schleifenkörpers
Wenn die Bedingung anfangs falsch ist, wird der Schleifenkörper nicht ausgeführt. Wenn die Bedingung anfangs falsch ist, wird der Schleifenkörper genau einmal ausgeführt.
Die Schleifenbedingung wird K-mal überprüft, um die Schleife K-mal zu durchlaufen. Die Schleifenbedingung wird K-1-mal überprüft, um die Schleife K-mal zu durchlaufen.
Wann ist die Verwendung einer While-Schleife sinnvoll?

  • Schleife soll laufen, solange die Bedingung wahr ist
  • Für eingangsgesteuerte Schleifen
  • Wenn die Schleifenbedingung nicht rechenintensiv ist
Wann ist die Verwendung einer Do-While-Schleife sinnvoll?

  • Schleife sollte mindestens einmal bei einer anfänglich falschen Schleifenbedingung ausgeführt werden
  • Für ausgangsgesteuerte Schleifen
  • Wenn die Schleifenbedingung rechenintensiv ist

Emulieren des Do-While-Verhaltens in Python

Aus dem vorherigen Abschnitt lassen sich zwei Bedingungen für die Emulation einer do-while-Schleife ableiten:

  • Die Anweisungen im Schleifenkörper müssen mindestens einmal ausgeführt werden, unabhängig davon, ob die Schleifenbedingung wahr oder falsch ist.
  • Die Bedingung muss nach der Ausführung der Anweisungen im Schleifenkörper überprüft werden. Wenn die Bedingung falsch ist, muss die Schleife beendet werden.

Unendliche While-Schleife und Break-Anweisung in Python

Eine unendliche while-Schleife in Python kann wie folgt definiert werden:

        while True:
            pass
        # Anstelle von True kann jede Bedingung verwendet werden, die immer True ist.
        while immer-wahre-Bedingung:
           pass
    

Die break-Anweisung kann verwendet werden, um den Schleifenkörper zu verlassen und die Kontrolle an die erste Anweisung außerhalb des Schleifenkörpers zu übergeben.

       while <Bedingung>:
            if <bestimmte-Bedingung>:
                break
    

Im ersten C-Beispiel der do-while-Schleife ist die Bedingung zum Fortsetzen der Schleife count < 0. Die Abbruchbedingung ist also ein count-Wert von null oder größer (count >= 0).

Hier ist die Python-Emulation der do-while-Schleife:

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

Python-Beispiele für Do-While-Schleifen

Wir greifen die Beispiele aus dem vorherigen Abschnitt auf und schreiben sie in Python neu, indem wir die Do-While-Schleife emulieren.

#1. Betrachten wir nochmals das Beispiel: Ausgabe der Werte der Variablen count, solange count kleiner als fünf ist.

Wir wissen, wie man eine Endlosschleife so definiert, dass der Schleifenkörper mindestens einmal ausgeführt wird.

Die Schleife sollte fortgesetzt werden, solange count kleiner als fünf ist. Wenn count fünf erreicht, sollten wir aus der Schleife ausbrechen. count == 5 ist also die Abbruchbedingung.

Zusammenfassend ergibt sich:

        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. Das Zahlenratespiel kann ebenfalls als Python-Do-While-Konstrukt umgeschrieben werden.

Bei diesem Spiel wird die Eingabe des Nutzers mit einer vorgegebenen Geheimzahl verglichen. Der Nutzer sollte die Geheimzahl innerhalb einer maximal zulässigen Anzahl von Versuchen, sagen wir max_guesses, erraten.

Der Code sollte den Nutzer zur Eingabe auffordern, egal ob seine Vermutung richtig oder falsch ist. Dies kann mit einer Endlosschleife erreicht werden.

Wann sollte die Schleife abgebrochen werden?

Die Schleife muss beendet werden, wenn:

  • Der Nutzer die richtige Zahl erraten hat
  • Der Nutzer hat die Zahl nicht erraten, aber die maximale Anzahl an Versuchen erreicht. Die Anzahl der falschen Vermutungen des Benutzers = max_guesses.

Der nachfolgende Code zeigt die Umsetzung:

            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
        

Anstelle des Schleifenabbruchs können auch informative print()-Anweisungen hinzugefügt werden, bevor die Schleife beendet wird.

        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
    

Hier sind zwei Beispiele der Ausgaben.

In dieser Ausgabe bricht die break-Anweisung die Schleife ab, sobald der Benutzer die richtige Geheimzahl erraten hat.

        # Sample output when secret_number = 43 and user gets it right!
        Guess a number:4
        Guess a number:3
        Guess a number:43
        Congrats, you guessed it right!
    

Hier ein weiteres Beispiel, wenn der Benutzer die maximale Anzahl an Versuchen erreicht, aber die Geheimzahl nicht erraten hat:

            # Sample output when secret_number = 33 and user fails to guess it right!
            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!
        

Fazit

Ich hoffe, dieses Tutorial hat Ihnen geholfen, die Emulation der Do-While-Schleife in Python zu verstehen.

Die wichtigsten Punkte sind:

  • Verwenden Sie eine Endlosschleife, um sicherzustellen, dass der Schleifenkörper mindestens einmal ausgeführt wird. Dies kann eine triviale Endlosschleife wie while True sein oder eine Schleife while <Bedingung>, bei der die Bedingung immer wahr ist.
  • Suchen Sie innerhalb der Schleife nach der Abbruchbedingung und verwenden Sie die break-Anweisung, um die Schleife unter der entsprechenden Bedingung zu verlassen.

Als nächstes erfahren Sie, wie for-Schleifen und die enumerate()-Funktion in Python verwendet werden können.