Bedingte Schleifen

Einführung

Bedingte Schleifen sind ein Weg etwas zu wiederholen, solange eine bestimmte Bedingung erfüllt, oder True, ist. Falls die Bedingung immer erfüllt ist (also nie False wird), läuft die Schleife endlos weiter. Falls die Bedingung schon anfänglich falsch ist, wird der Code in der Schleife niemals ausgeführt! In Python werden bedingte Schleifen mit der while-Anweisung definiert:

word = ''
sentence = ''
print('Please enter some words.')
print('Include a period (.) when you are finished.')
while '.' not in word:
    word = input('next word: ')
    sentence = word + ' ' + sentence
print()
print('Aha! You said:')
print(sentence)

Wir nennen diesen Teil des Quelltextes die ‘Bedingung’: '.' not in word

Ob die Bedingung wahr (True) zurückgibt oder nicht entscheidet, ob der Quelltext innerhalb der while-Schleife ausgeführt wird.

Lies den obigen Quellcode und schau, ob du im Kopf herleiten kannst, was er tut (und was die endgültige Ausgabe sein wird).

Dann kopier ihn in eine Datei, sagen wir satz.py, und führe ihn aus – schau genau, was er tut. Trifft das, was du dir gedacht hast, zu?

Bemerkung

Falls du Python 2 benutzt, wirst du input``mit ``raw_input ersetzen müssen, um das Programm korrekt auszuführen.

Schildkrötengefängnis

Übung

The turtle has been up to its usual tricks again, robbing liquor stores and building up huge gambling debts. It’s time for turtle to be put into a cell that it can’t get out of.

Lass uns eine neue Version von forward() bauen. Eine, die die Schildkröte herumdreht, falls sie versucht, sich weiter als 100 von ihrem Ursprung zu entfernen. Wir brauchen eine while-Schleife und einige neue turtle-Funktionen:

  • turtle.distance(0, 0)- Entfernung der Schildkröte vom Ursprung

  • turtle.towards(0, 0) - Der Winkel, der zurück zum Ursprungspunkt führt

  • turtle.setheading(Winkel) - Lege die Ausrichtung der Schildkröte direkt fest

Du kannst, wenn du magst, versuchen, mit der turtle in einem Interpreter herumzuspielen und die Funktionen zu benutzen, um genau zu sehen, was sie tut.

Jetzt wirst du die Gefängnislogik implementieren müssen, indem du die turtle-Funktionen, vielleicht eine while-Schleife und ein bisschen bedingte Logik, verwendest. Es ist ein bisschen haarig, aber bleib dran! Scheue nicht davor zurück, deine Idee mit einem Coach oder einem anderen Lernenden durchzusprechen.

Lösung

def forward(distance):
    while distance > 0:
        if turtle.distance(0,0) > 100:
            angle = turtle.towards(0,0)
            turtle.setheading(angle)
        turtle.forward(1)
        distance = distance - 1

Zeichne eine Spirale

Schleifen können mit der break-Anweisung unterbrochen werden. Das ist besonders nützlich, wenn du eine Endlosschleife schreibst, welches eine Schleife ist, deren Bedingung immer wahr (True) ist.

Übung

Schreibe eine while-Schleife mit einer Bedingung, die immer wahr (True) ist, um eine Spirale zu malen. Unterbrich die Schleife, wenn die turtle eine gewisse Distanz zum Mittelpunkt erreicht hat. Benutze die Funktion turtle.distance(x, y), um die Entfernung der Schildkröte zu dem durch die x- und y-Koordinaten bestimmten Punkt zu errechnen.

Um das zu tun, brauchst Du die Funktionen turtle.xcor() und turtle.ycor(), welche die Position der Schildkröte auf der X- und Y-Achse zurückgeben.

Bemerkung

Um eine Spirale zu zeichnen, muss die Schildkröte um einen konstanten Winkel gedreht werden und dabei um eine anwachsende Strecke vorwärts bewegt werden.

Lösung

def draw_spiral(radius):
    original_xcor = turtle.xcor()
    original_ycor = turtle.ycor()
    speed = 1
    while True:
        turtle.forward(speed)
        turtle.left(10)
        speed += 0.1
        if turtle.distance(original_xcor, original_ycor) > radius:
            break

Bonus

Kannst du eine Bedingung für die Schleife formulieren, so dass du du keine Endlosschleife while True oder die break-Anweisung benötigst? Welche Version findest du einfacher zu verstehen?