Mit der Python While-Loop wird ein Code-Block wie­der­holt aus­ge­führt, solange eine Bedingung wahr ist. While-Schleifen kommen in Python in erster Linie zum Einsatz, wenn die Anzahl der be­nö­tig­ten Ite­ra­tio­nen nicht vorab feststeht. Wir erklären, wie der While-Loop in Python funk­tio­niert.

Tipp

Lernen Sie mit unserem Python-Tutorial, selbst­stän­dig Python-Code zu schreiben.

Was ist die While-Loop in Python?

Bei der While-Schleife in Python handelt es sich um eine Kon­troll­struk­tur. Kon­troll­struk­tu­ren bestimmen darüber, welcher Code-Pfad zur Laufzeit be­schrit­ten wird. Schleifen kommen generell zum Einsatz, um einen Code-Block wie­der­holt aus­zu­füh­ren. Hier eine Übersicht wichtiger Kon­troll­struk­tu­ren in Python:

Kon­troll­struk­tur in Python Erklärung
If-Else-Ver­zwei­gung Führt Code-Block einmalig aus, sofern Kondition wahr ist.
Python While-Schleife Führt Code-Block wie­der­holt aus, solange Kondition wahr ist.
Python For-Schleife Iteriert über den Elementen einer Kol­lek­ti­on und führt dabei Code-Block für jedes Element aus.

Ty­pi­scher­wei­se versuchen Pro­gram­mier­neu­lin­ge ohne Kenntnis von Schleifen, deren Funk­tio­na­li­tät nach­zu­bil­den. Anstatt eine Da­ten­struk­tur mit mehreren Elementen zu de­fi­nie­ren und mit einer Schleife zu ver­ar­bei­ten, de­fi­nie­ren sie eine eigene Variable für jeden Datensatz. Ferner wird der Code für die Ver­ar­bei­tung der Da­ten­sät­ze du­pli­ziert. Heraus kommt sub­op­ti­ma­ler Code; hier dar­ge­stellt am Beispiel, drei Personen samt Namen und Alter aus­zu­ge­ben:

person1 = ('Jim', 17)
person2 = ('Jack', 42)
person3 = ('John', 63)
print(f"{person1[0]}, {person1[1]} years old")
print(f"{person2[0]}, {person2[1]} years old")
print(f"{person3[0]}, {person3[1]} years old")

Neben der un­er­wünsch­ten Code-Du­pli­zie­rung birgt dieser Ansatz ein lo­gis­ti­sches Problem: Wenn die Anzahl der Da­ten­sät­ze erst zur Laufzeit feststeht, lassen sich die ent­spre­chen­den einzelnen Variablen nicht vorab de­fi­nie­ren. Zur Lösung des Problems kommen Kol­lek­tio­nen von Elementen und Schleifen zu deren Ver­ar­bei­tung zum Einsatz.

Wenn zur Laufzeit bekannt ist, wie viele Wie­der­ho­lun­gen benötigt werden, liefert die For-Schleife in Python das beste Ergebnis. Bei­spiels­hal­ber bilden wir den Code zur Ausgabe von drei Personen samt Alter mittels For-Schleife ab. Der Code funk­tio­niert ohne Du­pli­zie­run­gen und enthält un­ab­hän­gig von der Anzahl der Da­ten­sät­ze nur zwei Variablen:

people = ('Jim', 'Jack', 'John')
ages = (17, 42, 63)
for person, age in zip(people, ages):
    print(f"{person}, {age} years old")

Im Gegensatz zur For-Schleife kommt eine While-Loop in Python zum Einsatz, wenn nicht bekannt ist, wie viele Wie­der­ho­lun­gen benötigt werden. Ein Beispiel ist der Austausch von Nach­rich­ten über eine geöffnete Ver­bin­dung. Solange die Ver­bin­dung besteht, werden Nach­rich­ten ver­ar­bei­tet. Eine If-Anweisung im Schlei­fen­kör­per wertet ein Signal aus und beendet die Ver­bin­dung, wenn gewünscht:

while connection_open():
    print('Ready to receive')
    process_messages()
    if should_close_connection():
        close_connection()
# once loop terminates
print('Connection was closed')

Ferner kommen While-Schleifen für prin­zi­pi­ell un­li­mi­tier­te Wie­der­ho­lun­gen zum Einsatz. Bekannte Beispiele sind Geld­au­to­ma­ten, die Linux-Ein­ga­be­auf­for­de­rung und die Python „Read-Eval-Print Loop“ (REPL). Hier sche­ma­tisch dar­ge­stellt eine REPL-Im­ple­men­ta­ti­on per While-End­los­schlei­fe:

# Loop
while True:
    # Read user input
    user_input = read_input()
    # Evaluate input and produce result
    result = eval(user_input)
    # Print result
    print(result)

Wie funk­tio­niert die While-Schleife in Python?

Die Python While-Schleife funk­tio­niert ähnlich der If-Else-Ver­zwei­gung in Python. Beide Kon­troll­struk­tu­ren bestehen aus zwei Teilen:

  1. einer Kondition, die aus­ge­wer­tet wird
  2. einem Körper mit An­wei­sun­gen

Der Un­ter­schied besteht darin, wie oft der Körper aus­ge­führt wird. Der Körper einer If-Anweisung wird höchstens einmal aus­ge­führt:

if condition:
    run_once()

Im Un­ter­schied zur If-Anweisung wird der Körper der While-Loop in Python ggf. mehrmals aus­ge­führt:

while condition:
    run_again()

Wir halten das generelle Muster beim Durch­lau­fen einer Python While-Schleife fest:

  1. Die Kondition wird aus­ge­wer­tet.
  2. Ist die Kondition wahr, wird der Schleifen-Körper aus­ge­führt.
  3. Die Kondition wird erneut aus­ge­wer­tet:
    1. Ist die Kondition weiterhin wahr, wie­der­holt sich der Prozess.
    2. Ist die Kondition unwahr, ter­mi­niert die Schleife.

Ähnlich der If-Anweisung kann eine While-Schleife in Python über einen op­tio­na­len Else-Block verfügen. Der Else-Block wird einmalig aus­ge­führt, sollte die Kondition unwahr sein bzw. werden:

while False:
    # this code doesn't loop
    never_runs()
else:
    # instead, this code runs once
    runs_once()

Wie un­ter­schei­den sich For- und While-Schleife in Python?

Die While-Loop ist auch in Python verwandt mit der For-Schleife. Beide führen einen Code-Block wie­der­holt aus. Man spricht dabei auch von „Ite­ra­tio­nen“ bzw. „iterieren“. Der Un­ter­schied liegt in der Anzahl der Wie­der­ho­lun­gen.

In Python kommen For-Schleifen in erster Linie zum Einsatz, um über den Elementen einer Kol­lek­ti­on zu iterieren. Dabei ist die maximale Anzahl an Ite­ra­tio­nen durch die Länge der Kol­lek­ti­on begrenzt. Wir iterieren über den Buch­sta­ben des Worts „Python“ und geben jeden Buch­sta­ben einzeln aus:

for letter in 'Python':
    print(letter)

Die Python While-Schleife ist nicht auf das Iterieren über Kol­lek­tio­nen spe­zia­li­siert und lässt sich flexibel einsetzen. Generell handelt es sich bei der While-Schleife um das grund­le­gen­de Schlei­fen­kon­strukt. Die Funk­tio­na­li­tät einer For-Schleife lässt sich mit Hilfe einer While-Schleife kon­stru­ie­ren; an­ders­her­um ist dies nicht der Fall.

Schauen wir uns ein paar Beispiele an. Wir bilden die Funk­tio­na­li­tät einer her­kömm­li­chen For-Schleife mit nu­me­ri­scher Schlei­fen­va­ria­ble als Python While-Schleife nach. Dazu de­fi­nie­ren wir außerhalb der Schleife eine Counter-Variable und in­kre­men­tie­ren deren Wert innerhalb des Schlei­fen­kör­pers:

counter = 0
limit = 10
while counter < limit:
    print(counter)
    counter += 1

Die äqui­va­len­te For-Schleife ist kürzer und direkter:

for counter in range(10):
    print(counter)

Ähnlich verhält es sich, wenn wir eine While-Schleife nutzen, um über den Buch­sta­ben eines Worts zu iterieren. Wir nutzen einen Iterator und die next()-Funktion. Ist der Iterator ver­braucht, wird statt einem Buch­sta­ben None zu­rück­ge­ge­ben; die Schleife ter­mi­niert. Der dabei her­aus­kom­men­de Code ist deutlich kom­pli­zier­ter als die äqui­va­len­te For-Schleife. Of­fen­sicht­lich ist die While-Schleife in Python für die Lösung dieses Problems nicht das optimale Werkzeug:

word = 'Python'
letters = iter(word)
letter = ''
while letter is not None:
    letter = next(letters, None)
    if letter:
        print(letter)

Vorsicht mit While-End­los­schlei­fen in Python

Ins­be­son­de­re sind While-Schleifen in Python in­ter­es­sant, um End­los­schlei­fen zu im­ple­men­tie­ren. Das mag zunächst wi­der­sin­nig er­schei­nen. Denn ver­se­hent­lich pro­du­zier­te End­los­schlei­fen sind ge­fürch­tet. Die Kondition wird nie unwahr; das Programm bleibt hängen:

while True:
    print("Forever…")

In der Tat exis­tie­ren viel­fäl­ti­ge An­wen­dungs­fäl­le für be­ab­sich­tig­te End­los­schlei­fen. Eine ver­se­hent­lich pro­du­zier­te While-End­los­schlei­fe wird in der Regel durch einen Ausdruck ver­ur­sacht, der immer zu True evaluiert. Hier ein Beispiel:

while 1 == 1 + 1 - 1:
    print("And ever…")
Tipp

Finden Sie sich im Python-REPL in einer While-End­los­schlei­fe gefangen, hilft die Tas­ten­kom­bi­na­ti­on Ctrl + C bzw. Strg + C weiter. Diese sendet ein Stopp-Signal an den Python-In­ter­pre­ter, der die Aus­füh­rung der Schleife abbricht.

Durch­läu­fe einer While-Loop in Python abbrechen und über­sprin­gen

Generell iteriert eine While-Schleife, bis die Loop-Bedingung unwahr wird. Ein ge­bräuch­li­cher Trick besteht darin, eine „Flag“-Variable als Bedingung ein­zu­set­zen. Dazu wird außerhalb der Schleife eine boolesche Variable definiert und in der Loop-Bedingung aus­ge­wer­tet. Bei Erreichen einer gewissen Bedingung innerhalb des Schlei­fen­kör­pers stellen wir die Flag scharf. Beim Auswerten der Kondition vor dem nächsten Durchlauf führt der neue Wert zum Beenden der Schleife:

aborted = False
while not aborted:
    print("Still going…")
    if some_cond:
        # will prevent next iteration
        aborted = True

Dieses Muster findet sich häufig, ist jedoch nicht besonders elegant. Was, wenn im Schlei­fen­kör­per nach dem Scharf­stel­len der Flag-Variable weiterer Code folgt? Dieser müsste über­sprun­gen werden. Prak­ti­scher­wei­se kennt Python in While-Schleifen die Break-Anweisung.

Wird innerhalb einer Schleife eine Break-Anweisung aus­ge­führt, ter­mi­niert die Schleife sofort. Damit ist die Break-Anweisung in Schleifen ähnlich der Return-Anweisung in Funk­tio­nen. Jedoch gibt break keinen Wert zurück. Es ist ge­bräuch­lich, die Break-Anweisung zum Abbrechen einer End­los­schlei­fe ein­zu­set­zen:

while True:
    print("Still going…")
    if some_cond:
        break
        # we never get here
        print("We shouldn't be here")
# we end up here after breaking
print("Done.")

Kon­zep­tu­ell verwandt mit der Break-Anweisung ist die Continue-Anweisung. Wird eine Continue-Anweisung im Schlei­fen­kör­per aus­ge­führt, wird der nach­fol­gen­de Code über­sprun­gen. Weiter geht es mit der nächsten Iteration. Mit break und continue lassen sich einfache, text­ba­sier­te Menüs im­ple­men­tie­ren, wie man sie aus frühen Com­pu­ter­spie­len kennt:

# `continue` takes us here
while True:
    print("Press G to start a new game")
    print("Press S to see stats")
    print("Press M for main menu")
    print("Press Q to quit")
    
    key_press = input("Your choice \n")[0].upper()
    print(f"You pressed {key_press}")
    
    if key_press == "G":
        # start game routines
        print("Starting game …")
    elif key_press == "S":
        # show stats
        print("Showing stats …")
    elif key_press == "M":
        # back to main menu
        print("Returning to menu")
        continue
    elif key_press == "Q":
        # break out of loop
        print("Quitting")
        break
    else:
        print("Unknown command. Try again")
# `break` takes us here
...

Aus ver­schach­tel­ten Python While-Schleifen aus­bre­chen

Der Einsatz in­ein­an­der ver­schach­tel­ter Schleifen führt schnell zu Ver­wir­run­gen. Dann ist es hilfreich, mittels Break-Anweisung aus der zuletzt ge­star­te­ten Schleife aus­zu­bre­chen. Was jedoch, wenn wir im selben Zug eine dar­über­lie­gen­de Schleife verlassen möchten? Für diesen Fall existiert kein eigenes Schlüs­sel­wort; prin­zi­pi­ell funk­tio­niert eine Lösung mittels Flag-Variable.

Eleganter lässt sich aus ver­schach­tel­ten While-Loops in Python aus­bre­chen, indem break, continue und else clever kom­bi­niert werden. Wir bauen unser Schlei­fen­kon­strukt so, dass die äußere Schleife ab­ge­bro­chen wird, wenn in der inneren Schleife eine Break-Anweisung aus­ge­führt wird. Dazu nutzen wir eine Continue-Anweisung innerhalb des inneren Else-Blocks, um das äußere break bei Bedarf zu über­sprin­gen:

# `continue` takes us here
while outer_cond:
    while inner_cond:
        ...
        if some_cond:
            print("Breaking out of inner loop")
            break
    # no inner `break` occured
    else:
        print("Continuing outer loop")
        # skip rest of outer loop body
        continue
    # we only get here if inner `break` occured
    print("Breaking out of outer loop")
    break
# outer `break` takes us here
...

Wie lässt sich die While-Schleife in Python verwenden?

In der Praxis finden sich viel­fäl­ti­ge An­wen­dungs­fäl­le für den Einsatz der While-Loop in Python. Generell werden While-Schleifen für Al­go­rith­men verwendet, bei denen die Anzahl der Wie­der­ho­lun­gen vorher nicht feststeht bzw. sich während der Aus­füh­rung ändert. While-Schleifen werden häufig in Kom­bi­na­ti­on mit weiteren Kon­troll­struk­tu­ren wie Ver­zwei­gun­gen und Try-Else-An­wei­sun­gen ein­ge­setzt. Be­trach­ten wir ein paar Beispiele.

In Python mit While-Schleife eine Kol­lek­ti­on kon­su­mie­ren

Um über den Elementen einer Kol­lek­ti­on zu iterieren, bietet sich in Python die For-Schleife an. Zumindest ist dies der Fall, sofern wir die Kol­lek­ti­on nicht aus dem Schlei­fen­kör­per heraus verändern. Was jedoch, wenn wir beim Durch­lau­fen der Elemente Än­de­run­gen vornehmen? Stellen wir uns vor, wir wollten beim Iterieren Elemente der Kol­lek­ti­on entfernen. Man spricht in diesem Fall davon, dass die Kol­lek­ti­on „kon­su­miert“ wird.

For-Schleifen können seltsame Fehler ver­ur­sa­chen, wenn sich die un­ter­lie­gen­de Kol­lek­ti­on während des Ite­rie­rens ändert. Möchten wir eine Kol­lek­ti­on kon­su­mie­ren, eignet sich in Python die While-Schleife. Wir nutzen die Kol­lek­ti­on direkt als Bedingung der While-Loop. Solange die Kol­lek­ti­on Elemente enthält, wird sie im boole­schen Kontext als wahr aus­ge­wer­tet. Ist die Kol­lek­ti­on leer, bricht die Schleife ab:

pieces = ['x', 'o', 'o', 'o', 'x', 'o', 'x', 'x']
while pieces:
    piece = pieces.pop()
    print(f"Removed {piece}")
# test
assert pieces == []

Mit While-Loop in Python eigene range()-Funktion im­ple­men­tie­ren

Mit While-Loops in Python lassen sich so­ge­nann­te Ge­ne­ra­to­ren im­ple­men­tie­ren. Ein Generator ist eine Funktion, die die Yield-Anweisung nutzt und auf Anfrage Werte generiert. Wir schreiben eine eigene Im­ple­men­ta­ti­on der range()-Funktion. Dabei nutzen wir die Yield-Anweisung innerhalb einer While-Schleife, um fort­lau­fen­de Zahlen zu ge­ne­rie­ren. Beim Erreichen der Yield-Anweisung wird ein Wert aus­ge­ge­ben und die Schleife pausiert:

def my_range(start, stop):
    # only positive ranges implemented
    if stop <= start:
        return None
    current = start
    while current < stop:
        yield current
        # next call of next() continues here
        current += 1
# test
assert list(my_range(7, 9)) == list(range(7, 9))

Mit Python While-Schleife ein Modell op­ti­mie­ren

Das Op­ti­mie­ren von Modellen gehört zum Stan­dard­re­per­toire wis­sen­schaft­li­cher Dis­zi­pli­nen. Dabei wird basierend auf einer Menge an Pa­ra­me­tern ein Modell berechnet. Im Anschluss werden die Parameter angepasst und das Modell erneut berechnet. Mit einer Ziel­funk­ti­on wird ab­ge­schätzt, ob die Änderung der Parameter ein besseres Modell ergeben hat. Ist dies der Fall, wird der Prozess wie­der­holt. So lassen sich iterativ optimale Parameter für das Modell finden.

Nor­ma­ler­wei­se pendelt sich das Modell nach einigen Wie­der­ho­lun­gen ein, so dass der Fort­schritt immer kleiner ausfällt. Fällt der Fort­schritt unter einen be­stimm­ten Schwel­len­wert, brechen wir die Op­ti­mie­rung ab. Um si­cher­zu­stel­len, dass die Schleife ter­mi­niert, begrenzen wir zu­sätz­lich die maximale Anzahl der Durch­läu­fe. Hier sche­ma­tisch ein Ansatz zur Mo­dell­op­ti­mie­rung unter Nutzung einer Python While-Loop:

limit = 5
round = 0
progress = True
while progress and round < limit:
    # attempt next optimization
    round += 1
    # compute optimized parameters
    params = optimize(params)
    # make a copy of the old model
    old_model = model
    # compute new model using optimized parameters
    model = run(model, params)
    # worthwhile to further optimize?
    progress = has_improved(model, old_model)

Ver­bin­dungs­auf­bau in Python mit While-Schleife und Try-Except im­ple­men­tie­ren

Der Aufbau einer Ver­bin­dung kann fehl­schla­gen. Daher ist es wün­schens­wert, den Ver­bin­dungs­auf­bau mit mehreren Versuchen zu im­ple­men­tie­ren. Da wir vorab nicht wissen können, wie viele Versuche benötigt werden, nutzen wir in Python eine While-Schleife. Ferner begrenzen wir die maximale Anzahl an Versuchen. War keiner der Versuche er­folg­reich, brechen wir mit einer Feh­ler­mel­dung ab.

Hier ein sche­ma­ti­scher Lö­sungs­an­satz: Wir nutzen eine Try-Except-Anweisung, um einen Fehler beim Ver­bin­dungs­auf­bau ab­zu­fan­gen. Der Einsatz einer Break-Anweisung im Try-Block sowie der einer Continue-Anweisung im Except-Block stellen sicher, dass wir korrekt iterieren. Schlägt der Ver­bin­dungs­auf­bau fehl, versuchen wir es mit continue erneut. Wurde die Ver­bin­dung her­ge­stellt, beenden wir die Schleife mit break:

max_tries = 10
attempt = 0
conn = None
# `continue` takes us here
while attempt < max_tries:
    attempt += 1
    print("Trying to get a connection")
    try:
        # might raise `ConnectionException`
        conn = get_connection()
        # got our connection
        break
    # `get_connection()` raised `ConnectionException`
    except ConnectionException:
        print("Something went wrong. Trying again")
        continue
# went through `max_tries` unsuccessful connection attempts
else:
    assert conn is None
    print("Unable to connect")
# `break` takes us here
assert conn is not None
print("Connection established")

Mit der Python While-Schleife über re­kur­si­ven Struk­tu­ren iterieren

Die While-Schleife in Python ist gut geeignet für Lösungen re­kur­si­ver Probleme. So eignet sich die Loop zum Iterieren über:

  • ver­schach­tel­ten Listen
  • Baum­struk­tu­ren
  • Graphen

Schauen wir uns am Beispiel einer Ma­trjosch­ka-Puppe an, wie das funk­tio­niert. Das bekannte Spielzeug besteht aus in­ein­an­der ver­schach­tel­ten Püppchen. Von außen ist die Anzahl der Ebenen nicht einsehbar. Statt­des­sen gehen wir iterativ vor: Wir öffnen das äußerste Püppchen und schauen, was wir im Inneren finden. Handelt es sich um eine weitere Ma­trjosch­ka, wie­der­ho­len wir den Prozess – ein typischer Fall für den Einsatz einer While-Schleife.

Wir mo­del­lie­ren die Ma­trjosch­ka als ver­schach­tel­te Liste mit jeweils einem einzigen Element. Entweder ist eine weitere Liste enthalten oder ein Objekt, das keine Liste ist. Wir iterieren über der Ma­trjosch­ka, solange diese eine Liste ist. Innerhalb des Schlei­fen­kör­pers nutzen wir eine Zuweisung, um eine Ebene tiefer zu gehen. Ir­gend­wann finden wir ein Element, das keine Liste ist. Dann haben wir das ent­hal­te­ne Objekt gefunden und brechen die Iteration ab:

def open_matroshka(matroshka):
    """
    * Matroshka dolls stacked five levels deep, with `None` inside:
    `matroshka = [[[[[None]]]]]`
    """
    while type(matroshka) is list:
        print("Opening the next matroshka")
        # go one level deeper
        matroshka = matroshka.pop()
    else:
        print(f"Reached the bottom and found {matroshka}")
        return matroshka
# test
matroshka = [[[[[None]]]]]
assert open_matroshka(matroshka) is None

Dieser simple Ansatz funk­tio­niert un­ab­hän­gig von der Tiefe der ver­schach­tel­ten Püppchen. Unser Al­go­rith­mus gräbt sich bis zum Boden durch und bringt das ent­hal­te­ne Objekt zum Vorschein. Die Magie der Python While-Schleife in Aktion.

Mit einer Python While-Schleife auf einem Spiel­brett laufen

Ein häufiges Ein­satz­sze­na­rio für While-Schleifen in Python besteht darin, eine Figur auf einem Spiel­brett zu bewegen. Möchte man ga­ran­tiert alle Felder besuchen, werden zwei in­ein­an­der ver­schach­tel­te Schleifen benötigt. Dabei gilt es, die Laufzeit zu b­eachten: Bei großen Räumen kann das Programm u. U. sehr lange laufen.

Wir im­ple­men­tie­ren einen simplen „Random Walk“, bei dem eine Figur auf dem Spiel­brett so lange zufällig bewegt wird, bis sie sich an einem Zielort befindet. Ein solches Be­we­gungs­mus­ter findet sich bei­spiels­wei­se bei der Bewegung eines Partikels in Flüs­sig­keit oder einer Fliege, die im Raum her­um­fliegt. Da vorher nicht bekannt ist, wie viele Ite­ra­tio­nen benötigt werden, setzen wir eine Python While-Loop ein.

Wir de­fi­nie­ren zunächst die random_walk()-Funktion, die die While-Schleife enthält. Mit dem Python-Operator für „Ist-Gleich“ über­prü­fen wir, ob die der­zei­ti­ge Position das Ziel ist. Wenn nicht, wird weiter iteriert:

def random_walk(board = (10, 10), goal = (4, 4), start = (0, 0)):
    # ensure arguments are valid
    if not (goal[0] in range(board[0]) and goal[1] in range(board[1]) and start[0] in range(board[0]) and start[1] in range(board[1])):
        print(f"Goal {goal} and / or start position {start} outside of board with dimensions {board}")
        return None, 0
    steps = 0
    pos = start
    # as long as we haven't reached the goal
    while not pos == goal:
        # move to neighboring position
        pos = get_neighbor(pos, board)
        steps += 1
        print(f"Moved to position {pos}")
    print(f"Reached goal at {pos} after {steps} steps")
    return pos, steps

Ferner de­fi­nie­ren wir eine Hilfs­funk­ti­on get_neighbor(), die ein mögliches Feld um eine bestimmte Position herum zu­rück­gibt:

def get_neighbor(pos, bounds):
     from random import choice
     """
          x = 0     . . .     m
                - - - - - - - -
      y = 0 |
              |
            . |              (x, y-1)
            . |  (x-1, y) (x, y)  (x+1, y)
            . |              (x, y+1)
              |
            n |
    
     """
     x, y = pos
     # computer neighbors
     neighbors = [ (x - 1, y), (x + 1, y), (x, y - 1), (x, y + 1) ]
     # filter out neighbors that are outside of bounds
     neighbors = [ pos for pos in neighbors if 0 <= pos[0] < bounds[0] and 0 <= pos[1] < bounds[1] ]
     # select a random neighbor
     neighbor = choice(neighbors)
     return neighbor

Im Anschluss testen wir unsere Random-Walk-Im­ple­men­ta­ti­on:

random_walk(board = (10, 10), goal = (4, 4), start = (5, 7))
Zum Hauptmenü