4.2 Schleife

In diesem Kapitel lernen Sie die Schleifenstrukturen in Python kennen.

Übersicht Schleifenarten

In Python gibt es zwei Haupttypen von Schleifen, um Codeblöcke wiederholt auszuführen: for-Schleifen und while-Schleifen.

Schleifenart Beschreibung
while-Schleife Wiederholt eine Sequenz von Anweisungen, solange eine Bedingung erfüllt ist. Eine while-Schleife ist gut, wenn die Anzahl der Schleifendurchläufe nicht klar ist.
for-Schleife Wiederholt eine Sequenz von Anweisungen für jedes Element einer Sammlung (z.B. Liste, Tupel, String). Eine for-Schleife ist gut, wenn die Anzahl der Schleifendurchläufe definiert ist.

Die while-Schleife kennen wir schon.

# Interne LED blinken lassen - schlecht 1
# J. Thomaschewski, 12.08.2024
from machine import Pin
from time import sleep
led = Pin('LED', Pin.OUT)
while True:
    led.on()
    sleep(0.5)
    led.off()
    sleep(0.5)

Verwendung der while-Schleife

Eine while-Schleife wird verwendet, wenn Sie eine Schleife benötigen, die solange läuft, bis eine bestimmte Bedingung nicht mehr erfüllt ist oder bis eine bestimmte Bedingung endlich erfüllt ist.

Beispiele für while-Schleifen

  1. Endlosschleife

    while True:
        print("Dies läuft unendlich...")
    

  2. Einfaches Beispiel

    1
    2
    3
    4
    x = 0
    while x < 5:
        print(x)
        x += 1
    
    Diese Problemstellung kann man besser mit einer for-Schleife lösen, da die Anzahl der Durchläufe klar ist.

Die while-Schleife verwendet man, wenn eine Endlosschleife benötigt wird oder wenn unklar ist, wie lange es dauert, bis der Zustand True erreicht wird (beispielsweise bei der unbeschränkten Möglichkeit ein Passwort richtig einzugeben).

Verwendung der for-Schleife

Eine for-Schleife wird verwendet, wenn wir eine festgelegte Anzahl von Iterationen durchlaufen möchten oder über eine Sammlung von Elementen iterieren müssen.

Auch bei Schleifen die richtige Einrückung entscheidend. Jeder Codeblock, der zu einer Schleife gehört, muss entsprechend eingerückt werden, um die Struktur des Programms korrekt darzustellen.

Beispiele für for-Schleifen

  1. Einfaches Beispiel

    Das i ist hier eine Laufvariable, die nach nach dem Beenden der for-Schleife den letzten wert beibehält (also i=4)

    for i in range(5):
        print("Durchlauf:", i)
    
    Ergebnis:
    Durchlauf: 0
    Durchlauf: 1
    Durchlauf: 2
    Durchlauf: 3
    Durchlauf: 4

  2. Iteration über eine Liste

    Hier ist nun farbe die Laufvariable

    1
    2
    3
    farben = ["rot", "grün", "blau"]
    for farbe in farben:
       print(farbe)
    
    Ergebnis:
    rot
    grüne
    blau

  3. Iteration über ein Dictionary - Keys verwenden

    1
    2
    3
    4
    # Ein dictionary besteht aus Bezeichner-Werte-Paaren (engl.: key-value)
    person = {"name": "Alice", "ort": "Wunderland"}
    for key in person:
        print(key)
    
    Ergebnis:
    name
    ort

  4. Iteration über ein Dictionary - Values verwenden

    1
    2
    3
    4
    # Ein dictionary besteht aus Bezeichner-Werte-Paaren (engl.: key-value)
    person = {"name": "Alice", "ort": "Wunderland"}
    for value in person.values():
        print(value)
    
    Ergebnis:
    Alice
    Wunderland

  5. Iteration über ein Dictionary - Keys und Values verwenden

    1
    2
    3
    4
    # Ein dictionary besteht aus Bezeichner-Werte-Paaren (engl.: key-value)
    person = {"name": "Alice", "ort": "Wunderland"}
    for key,value in person.items():
        print(key, value)
    
    Ergebnis:
    name Alice
    ort Wunderland

  6. Verschachtelte Schleifen

    1
    2
    3
    for i in range(3):
        for j in range(2):
            print(i, j)
    

    Die Ausgabe lautet:
    0 0
    0 1
    1 0
    1 1
    2 0
    2 1

Aufgabe verschachtelte Schleife

Wie lautet die Ausgabe nun?

1
2
3
for i in range(2):
    for j in range(3):
        print(i, j)

Verwendung von break und continue

In Python können Sie die Anweisungen break und continue verwenden, um den Fluss einer Schleife zu steuern:

  • break: Bricht die Schleife vollständig ab und fährt mit dem nächsten Codeblock nach der Schleife fort.
  • continue: Überspringt den aktuellen Schleifendurchlauf und beginnt mit dem nächsten Durchlauf.

Beispiel für break und continue

1
2
3
4
5
6
for i in range(10):
    if i == 3:
        continue  # Überspringt den Rest dieses Schleifendurchlaufs
    if i == 7:
        break  # Bricht die Schleife ab
    print(i)

Klausurrelevant

In der Prüfung müssen Sie in der Lage sein, sowohl for-Schleifen als auch while-Schleifen anzuwenden und auch zu verstehen, wie Sie break und continue sinnvoll einsetzen.

Pi Pico Script

Wir nehmen das Pi Pico-Board und lassen die interne LED blinken, wobei die Blinkdauer mithilfe einer Schleife und Listen variiert wird.

# LED-Morsen: SOS und Name "Emden"
# J. Thomaschewski, 04.09.2024
from machine import Pin
from time import sleep

led = Pin('LED', Pin.OUT)

# Morsen für SOS (kurz-kurz-kurz, lang-lang-lang, kurz-kurz-kurz)
sos = [0.2, 0.2, 0.2, 0.6, 0.6, 0.6, 0.2, 0.2, 0.2]

# Morsen für "Emden" (lang-lang, kurz-lang-lang-lang, lang-lang-lang, kurz-lang-lang, kurz-lang-lang-lang)
emden = [0.6, 0.6, 0.2, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.6, 0.2, 0.6, 0.6, 0.6, 0.2, 0.6, 0.6, 0.6]

# SOS morsen
for duration in sos:
    led.on()
    sleep(duration)
    led.off()
    sleep(0.2)  # kurze Pause zwischen den Signalen

sleep(3)  # Pause zwischen den Wörtern

# Name "Emden" morsen
for duration in emden:
    led.on()
    sleep(duration)
    led.off()
    sleep(0.2)  # kurze Pause zwischen den Signalen

In diesem Code wird die Variable duration in den for-Schleifen verwendet, um die Dauer (in Sekunden) zu speichern, die die LED bei jedem Schritt ein- bzw. ausgeschaltet bleibt. Das Wort duration wurde gewählt, damit klar wird, dass es sich um eine Zeitdauer handelt.

Die Schleife for duration in sos: bedeutet, dass die Variable duration nacheinander die Werte aus der Liste sos annimmt, also erst 0.2, dann 0.2, dann 0.2 usw. Für jeden dieser Werte wird die LED für die entsprechende Dauer eingeschaltet, dann eine kurze Pause gemacht, und der Vorgang wird für das nächste Element in der Liste wiederholt.

Es ist wichtig zu verstehen, dass der Name duration nur eine Hilfsvariable ist. Man könnte diese Variable auch i, step oder einen anderen beliebigen Namen nennen. Der Name sollte jedoch sinnvoll gewählt werden, um den Code lesbarer zu machen. Wenn Sie duration verwenden, ist sofort klar, dass es sich um die Dauer der LED-Leuchtdauer handelt. Wenn Sie stattdessen i oder step verwenden würden, wäre die Bedeutung weniger offensichtlich, aber der Code würde genauso funktionieren.

Aufgabe (Klausurniveau)

Schreiben Sie ein Script, das SOS morsen lässt, indem Sie ein dictionary verwenden, um die Morsezeichen für die Buchstaben S und O zu speichern. Verwenden Sie das dictionary, um die LED entsprechend blinken zu lassen.

Lösung
# SOS Morsen mit Dictionary
# J. Thomaschewski, 04.09.2024
from machine import Pin
from time import sleep

led = Pin('LED', Pin.OUT)

# Dictionary mit Morsezeichen für S und O
morseCode = {
    'S': [0.2, 0.2, 0.2],  # Kurz-Kurz-Kurz
    'O': [0.6, 0.6, 0.6]   # Lang-Lang-Lang
}

# SOS Morsen
sos = ['S', 'O', 'S']

for buchstabe in sos:
    for duration in morseCode[buchstabe]:
        led.on()
        sleep(duration)
        led.off()
        sleep(0.2)  # kurze Pause zwischen den Signalen
    sleep(0.6)  # Pause zwischen den Buchstaben

Aufgabe (Klausurniveau)

Schreiben Sie ein Script, das die LED 10 Mal mit abnehmender Geschwindigkeit blinken lässt.

Lösungen
# LED 10 Mal mit abnehmender Geschwindigkeit blinken lassen
# J. Thomaschewski, 04.09.2024
from machine import Pin
from time import sleep

led = Pin('LED', Pin.OUT)

delay = 0.1  # Startverzögerung

for i in range(10):
    led.on()
    sleep(delay)
    led.off()
    sleep(delay)
    delay += 0.2  # Verzögerung bei jedem Durchlauf erhöhen

Aufgabe Bewegen auf dem Display

  1. Schreiben Sie ein Script, das "Moin" auf dem Display zeigt.
  2. Nun soll "Moin" auf dem Display von oben nach unten wandern. Verwenden Sie dafür eine for-Schleife