Tutorial:Programmieren mit Python/Kontrollstrukturen: Unterschied zwischen den Versionen

Aus KGS-Wiki
(Die Seite wurde neu angelegt: „== Bedingte Verzweigung (<code>if</code>, <code>elif</code>, <code>else</code>) == Zur Realisierung einer Fallunterscheidung werden in Python (Programmiersprache) die Schlüsselworte <code>if</code>, <code>elif</code> und <code>else</code> genutzt. === Bedingte Anweisung mit <code>if</code> === {{Thumbnailbox | INHALT = <mermaid> graph TD start["..."] --> if{"Bedingung"} -- ja --> teila["Teil A"] --> ende["..."] if -- nein -->…“)
 
 
(4 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
== Bedingte Verzweigung (<code>if</code>, <code>elif</code>, <code>else</code>) ==
{{../Navigation}}
Zur Realisierung einer [[Bedingte Anweisung|Fallunterscheidung]] werden in [[Python (Programmiersprache)|Python]] die Schlüsselworte <code>if</code>, <code>elif</code> und <code>else</code> genutzt.
== Bedingte Verzweigung ({{Python|if}}, {{Python|elif}}, {{Python|else}}) ==
Zur Realisierung einer [[Bedingte Anweisung|Fallunterscheidung]] werden in [[Python (Programmiersprache)|Python]] die Schlüsselworte {{Python|if}}, {{Python|elif}} und {{Python|else}} genutzt.


=== Bedingte Anweisung mit <code>if</code> ===
=== Bedingte Anweisung mit {{Python|if}} ===
{{Thumbnailbox
{{Thumbnailbox
| INHALT = <mermaid>
| INHALT = <mermaid>
Zeile 10: Zeile 11:
</mermaid>
</mermaid>
}}
}}
Der einfachste Fall ist eine [[Sequenz]] von [[Anweisung]]en, die nur dann ausgeführt werden soll, wenn eine bestimmte [[Wahrheitswert|Bedingung]] erfüllt ist, sonst nicht. Die Schreibweise ist <code>if</code> ''Bedingung''<code>:</code> und dann folgen die Anweisungen, die in dem Fall ausgeführt werden sollen, dass die Bedingung wahr ist. Diese Anweisungen müssen eingerückt werden, damit der [[Interpreter]] identifizieren kann, welche Anweisungen in Abhängigkeit von der Bedingung und welche immer ausgeführt werden sollen.
Der einfachste Fall ist eine [[Sequenz]] von [[Anweisung]]en, die nur dann ausgeführt werden soll, wenn eine bestimmte [[Wahrheitswert|Bedingung]] erfüllt ist, sonst nicht. Die Schreibweise ist {{Python|if}} ''Bedingung''{{Python|:}} und dann folgen die Anweisungen, die in dem Fall ausgeführt werden sollen, dass die Bedingung wahr ist. Diese Anweisungen müssen eingerückt werden, damit der [[Interpreter]] identifizieren kann, welche Anweisungen in Abhängigkeit von der Bedingung und welche immer ausgeführt werden sollen.


Im folgenden Beispiel wird die <code>print</code>-Anweisung nur ausgeführt, falls der Ausdruck (<code>notendurchschnitt > 4</code>) zu wahr (<code>True</code>) ausgewertet wird:<syntaxhighlight lang="python" line="1">
Im folgenden Beispiel wird die {{Python|print}}-Anweisung nur ausgeführt, falls der Ausdruck ({{Python|notendurchschnitt > 4}}) zu wahr ({{Python|True}}) ausgewertet wird:<syntaxhighlight lang="python" line="1">
if notendurchschnitt > 4.0:
if notendurchschnitt > 4.0:
     # Teil A
     # Teil A
Zeile 19: Zeile 20:


==== Bedingungen ====
==== Bedingungen ====
Als Bedingung kann jeder [[Ausdruck]] eingesetzt werden, der zu <code>True</code> oder <code>False</code> ausgewertet werden kann. Hier werden also in der Regel '''logische Ausdrücke''' verwendet, zum Beispiel Vergleiche mit den Vergleichsoperatoren <code><</code> (kleiner als), <code>></code> (größer als) oder <code>==</code> (gleich).
Als Bedingung kann jeder [[Ausdruck]] eingesetzt werden, der zu {{Python|True}} oder {{Python|False}} ausgewertet werden kann. Hier werden also in der Regel '''logische Ausdrücke''' verwendet, zum Beispiel Vergleiche mit den Vergleichsoperatoren {{Python|<}} (kleiner als), {{Python|>}} (größer als) oder {{Python|{{=}}{{=}}}} (gleich).


Mehrere Vergleiche lassen sich mit den [[Logik|logischen Verknüpfungsoperatoren]] <code>and</code> (logisches UND) und <code>or</code> (logisches ODER) zu einer Bedingung verknüpfen. Im folgenden Beispiel wird die <code>print</code>-Anweisung ausgeführt, falls der Wert der [[Variable]]n <code>notendurchschnitt</code> größer als 4 oder kleiner als 1.5 ist (d. h. wenn mindestens einer der mit <code>or</code> verknüpften Vergleiche wahr ist):
Mehrere Vergleiche lassen sich mit den [[Logik|logischen Verknüpfungsoperatoren]] {{Python|and}} (logisches UND) und {{Python|or}} (logisches ODER) zu einer Bedingung verknüpfen. Im folgenden Beispiel wird die {{Python|print}}-Anweisung ausgeführt, falls der Wert der [[Variable (Informatik)|Variable]]n {{Python|notendurchschnitt}} größer als 4 oder kleiner als 1.5 ist (d. h. wenn mindestens einer der mit {{Python|or}} verknüpften Vergleiche wahr ist):
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
if notendurchschnitt > 4.0 or notendurchschnitt < 1.5:
if notendurchschnitt > 4.0 or notendurchschnitt < 1.5:
Zeile 27: Zeile 28:
     print('Die Klausur muss von der Schulleitung genehmigt werden.')
     print('Die Klausur muss von der Schulleitung genehmigt werden.')
</syntaxhighlight>
</syntaxhighlight>
Werden Vergleiche dagegen mit <code>and</code> verknüpft, müssen alle einzelnen Vergleiche zu wahr ausgewertet werden, damit die Gesamtbedingung wahr ist:
Werden Vergleiche dagegen mit {{Python|and}} verknüpft, müssen alle einzelnen Vergleiche zu wahr ausgewertet werden, damit die Gesamtbedingung wahr ist:
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
if notendurchschnitt > 4.0 and anzahl_klausuren >= 2:
if notendurchschnitt > 4.0 and anzahl_klausuren >= 2:
     # Teil A
     # Teil A
     print('Die Klausur muss von der Schulleitung genehmigt werden.')</code>
     print('Die Klausur muss von der Schulleitung genehmigt werden.')
</syntaxhighlight>
</syntaxhighlight>


=== Alternative mit <code>else</code> ===
=== Alternative mit {{Python|else}} ===
{{Thumbnailbox
{{Thumbnailbox
| INHALT = <mermaid>
| INHALT = <mermaid>
Zeile 42: Zeile 43:
</mermaid>
</mermaid>
}}
}}
Um alternative Anweisungen auszuführen, wenn die Bedingung nicht erfüllt ist, wird das Schlüsselwort <code>else:</code> (engl. ''sonst'') verwendet. Das <code>else</code> wird im Gegensatz zu den Anweisungen für den Dann- und den Sonst-Fall nicht eingerückt, steht also auf derselben Einrückungstiefe wie das <code>if</code>.
Um alternative Anweisungen auszuführen, wenn die Bedingung nicht erfüllt ist, wird das Schlüsselwort {{Python|else:}} (engl. ''sonst'') verwendet. Das {{Python|else}} wird im Gegensatz zu den Anweisungen für den Dann- und den Sonst-Fall nicht eingerückt, steht also auf derselben Einrückungstiefe wie das {{Python|if}}.
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
if notendurchschnitt > 4.0:
if notendurchschnitt > 4.0:
Zeile 49: Zeile 50:
else:
else:
     # Teil B
     # Teil B
     print('Alles okay, die Klausur kannst du problemlos zurückgeben.')</code>
     print('Alles okay, die Klausur kannst du problemlos zurückgeben.')
</syntaxhighlight>
</syntaxhighlight>


=== Mehrfache bedingte Verzweigung mit <code>elif</code> ===
=== Mehrfache bedingte Verzweigung mit {{Python|elif}} ===
{{Thumbnailbox
{{Thumbnailbox
| INHALT = <mermaid>
| INHALT = <mermaid>
Zeile 61: Zeile 62:
</mermaid>
</mermaid>
}}
}}
Mit <code>elif</code> (kurz für ''else if'') können mehrere Bedingungen nacheinander abgeprüft werden. In diesem Fall werden die Bedingungen solange abgeprüft, ''bis eine davon wahr ist''. Nur die Anweisungen, die zu dieser Bedingung gehören werden dann ausgeführt.
Mit {{Python|elif}} (kurz für ''else if'') können mehrere Bedingungen nacheinander abgeprüft werden. In diesem Fall werden die Bedingungen solange abgeprüft, ''bis eine davon wahr ist''. Nur die Anweisungen, die zu dieser Bedingung gehören werden dann ausgeführt.


Nach einem <code>if</code> können beliebig viele <code>elif</code>s folgen. Für den Fall, dass gar keine der abgeprüften Bedingungen wahr ist, kann nach den <code>elif</code>s ein <code>else</code> folgen.
Nach einem {{Python|if}} können beliebig viele {{Python|elif}}s folgen. Für den Fall, dass gar keine der abgeprüften Bedingungen wahr ist, kann nach den {{Python|elif}}s ein {{Python|else}} folgen.
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
if notendurchschnitt > 4.0:
if notendurchschnitt > 4.0:
Zeile 75: Zeile 76:
</syntaxhighlight>
</syntaxhighlight>


Im obigen Beispiel würde ein Notendurchschnitt von <code>4.2</code> beide Bedingungen erfüllen, aber es würde nur der Text "Die Klausur muss von der Schulleitung genehmigt werden." ausgegeben werden, da die Auswertung nach dem ersten Auffinden einer erfüllten Bedingung endet.
Im obigen Beispiel würde ein Notendurchschnitt von {{Python|4.2}} beide Bedingungen erfüllen, aber es würde nur der Text "Die Klausur muss von der Schulleitung genehmigt werden." ausgegeben werden, da die Auswertung nach dem ersten Auffinden einer erfüllten Bedingung endet.


== Bedingte Wiederholung (<code>while</code>) ==
== Bedingte Wiederholung ({{Python|while}}) ==
{{Thumbnailbox
{{Thumbnailbox
| INHALT = <mermaid>
| INHALT = <mermaid>
Zeile 84: Zeile 85:
</mermaid>
</mermaid>
}}
}}
Um eine Anweisung oder eine Sequenz von Anweisungen [[Bedingte Wiederholung|in Abhängigkeit von einer Bedingung zu wiederholen]], nutzen wir das Schlüsselwort <code>while</code>, welches genau so genutzt wird wie <code>if</code>: nach dem <code>while</code> folgt eine Bedingung, die erfüllt sein kann oder nicht, danach folgen, eingerückt, die Anweisungen, die so lange ausgeführt werden sollen, wie die Bedingung erfüllt ist.
Um eine Anweisung oder eine Sequenz von Anweisungen [[Bedingte Wiederholung|in Abhängigkeit von einer Bedingung zu wiederholen]], nutzen wir das Schlüsselwort {{Python|while}}, welches genau so genutzt wird wie {{Python|if}}: nach dem {{Python|while}} folgt eine Bedingung, die erfüllt sein kann oder nicht, danach folgen, eingerückt, die Anweisungen, die so lange ausgeführt werden sollen, wie die Bedingung erfüllt ist.


Im folgenden Beispiel soll der Nutzer seine Postleitzahl eingeben. Die Eingabe wird geprüft und die Eingabeaufforderung wiederholt, solange wie keine Zahl eingegeben wurde:
Im folgenden Beispiel soll der Nutzer seine Postleitzahl eingeben. Die Eingabe wird geprüft und die Eingabeaufforderung wiederholt, solange wie keine Zahl eingegeben wurde:
Zeile 99: Zeile 100:
while x >= 1:
while x >= 1:
     x = x - 1
     x = x - 1
     print(x)</code>
     print(x)
</syntaxhighlight>
</syntaxhighlight>
{{!}}
{{!}}
Zeile 113: Zeile 114:
| INHALT = <mermaid>
| INHALT = <mermaid>
graph TD
graph TD
start["..."] --> teile["Teil E"] --> teila
start["..."] --> teile["Teil E"] --> teile
</mermaid>
</mermaid>
}}
}}
Eine endlos laufende Wiederholung lässt sich realisieren, indem nach dem <code>while</code> eine immer wahre Bedingung gestellt wird:
Eine endlos laufende Wiederholung lässt sich realisieren, indem nach dem {{Python|while}} eine immer wahre Bedingung gestellt wird:
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
while True:
while True:
Zeile 127: Zeile 128:
</syntaxhighlight>
</syntaxhighlight>


Auch eine endlos laufende Wiederholung kann aber mit dem Schlüsselwort <code>break</code> unterbrochen werden. Wenn mehrere Wiederholungen ineinander geschachtelt werden, wird dabei nur die innerste unterbrochen, in der sich die <code>break</code>-Anweisung befindet.
Auch eine endlos laufende Wiederholung kann aber mit dem Schlüsselwort {{Python|break}} unterbrochen werden. Wenn mehrere Wiederholungen ineinander geschachtelt werden, wird dabei nur die innerste unterbrochen, in der sich die {{Python|break}}-Anweisung befindet.


Dies kann vor allem nützlich sein, wenn die Abbruchbedingung der Wiederholung sehr komplex oder mehrstufig ist. In folgendem Beispiel soll der Nutzer seine Postleitzahl eingeben. Die Eingabe wird in zwei Schritten auf Korrektheit überprüft: zuerst wird mit <code>isnumeric()</code> geprüft, ob der eingegebene String <code>plz</code> nur aus Ziffern besteht; falls dies der Fall ist, wird überprüft, ob die eingegebene Zahl zwischen 01001 und 99998 liegt und damit eine gültige deutsche Postleitzahl sein könnte. Hierbei wird die Eingabe in ein <code>int</code> konvertiert, was bei einer nicht-numerischen Eingabe zu einer Fehlermeldung und dem Abbruch des Programms führen würde.
Dies kann vor allem nützlich sein, wenn die Abbruchbedingung der Wiederholung sehr komplex oder mehrstufig ist. In folgendem Beispiel soll der Nutzer seine Postleitzahl eingeben. Die Eingabe wird in zwei Schritten auf Korrektheit überprüft: zuerst wird mit {{Python|isnumeric()}} geprüft, ob der eingegebene String {{Python|plz}} nur aus Ziffern besteht; falls dies der Fall ist, wird überprüft, ob die eingegebene Zahl zwischen 01001 und 99998 liegt und damit eine gültige deutsche Postleitzahl sein könnte. Hierbei wird die Eingabe in ein {{Python|int}} konvertiert, was bei einer nicht-numerischen Eingabe zu einer Fehlermeldung und dem Abbruch des Programms führen würde.
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
while True:
while True:
Zeile 141: Zeile 142:
</syntaxhighlight>
</syntaxhighlight>


== Wiederholungen über eine Datenstruktur (<code>for</code>) ==
== Wiederholungen über eine Datenstruktur ({{Python|for}}) ==
Das Schlüsselwort <code>for</code> kann man benutzen, um ''für alle'' Elemente ''in'' einer [[Datenstruktur]] dieselben Anweisungen auszuführen. Das kann eine [[Liste]] sein, ein [[String (Datenstruktur)|String]] oder ähnliches. Die Syntax der Wiederholung ist <code>for</code> ''Element'' <code>in</code> ''Liste''<ref>Statt einer Liste kann jede beliebige Datenstruktur verwendet werden, die iterierbar (engl. ''iterable'') ist, d. h. es zulässt, eine Menge an Elementen in einer gewissen Reihenfolge durchzugehen.</ref><code>:</code> und danach folgen die Anweisungen, wieder eingerückt.
Das Schlüsselwort {{Python|for}} kann man benutzen, um ''für alle'' Elemente ''in'' einer [[Datenstruktur]] dieselben Anweisungen auszuführen. Das kann eine [[Liste]] sein, ein [[String (Datenstruktur)|String]] oder ähnliches. Die Syntax der Wiederholung ist {{Python|for}} ''Element'' {{Python|in}} ''Liste''<ref>Statt einer Liste kann jede beliebige Datenstruktur verwendet werden, die iterierbar (engl. ''iterable'') ist, d. h. es zulässt, eine Menge an Elementen in einer gewissen Reihenfolge durchzugehen.</ref>{{Python|:}} und danach folgen die Anweisungen, wieder eingerückt.
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
klassenliste = ['Max','Moritz','Paul','Paula','Enno','Enna','Jakob','Johannes','Lukas','Mats']
klassenliste = ['Max','Moritz','Paul','Paula','Enno','Enna','Jakob','Johannes','Lukas','Mats']
Zeile 150: Zeile 151:
</syntaxhighlight>
</syntaxhighlight>


=== Wiederholungen mit fester Anzahl (<code>range</code>) ===
=== Wiederholungen mit fester Anzahl ({{Python|range}}) ===
Für eine [[Wiederholung mit fester Anzahl]], wie sie aus [[Scratch]] bekannt ist, kann die Datenstruktur <code>range</code> benutzt werden. Eine <code>range</code> zählt dabei von einem ggf. vorgegebenen ''Startwert'' zu einem vorgegebenen ''Endwert'' mit einer ggf. ebenfalls vorgegebenen ''Schrittweite'' hoch. Dies kann für eine <code>for</code>-Wiederholung genutzt werden. Der <code>range</code> können dabei bis zu drei Parameter übergeben werden:
Für eine [[Wiederholung mit fester Anzahl]], wie sie aus [[Scratch]] bekannt ist, kann die Datenstruktur {{Python|range}} benutzt werden. Eine {{Python|range}} zählt dabei von einem ggf. vorgegebenen ''Startwert'' zu einem vorgegebenen ''Endwert'' mit einer ggf. ebenfalls vorgegebenen ''Schrittweite'' hoch. Dies kann für eine {{Python|for}}-Wiederholung genutzt werden. Der {{Python|range}} können dabei bis zu drei Parameter übergeben werden:


* ein ''Startwert'', von wo die <code>range</code> zu zählen beginnen soll, dieser ist optional und wird standardmäßig auf 0 gesetzt
* ein ''Startwert'', von wo die {{Python|range}} zu zählen beginnen soll, dieser ist optional und wird standardmäßig auf 0 gesetzt
* ein ''Endwert'', bei dem die <code>range</code> aufgehört haben soll, zu zählen, dieser muss auf jeden Fall angegeben werden.
* ein ''Endwert'', bei dem die {{Python|range}} aufgehört haben soll, zu zählen, dieser muss auf jeden Fall angegeben werden.
* eine ''Schrittweite'', die beim Zählen eingesetzt werden soll, diese ist optional und wird standardmäßig auf 1 gesetzt. Wenn die <code>range</code> rückwärts zählen soll, muss eine negative Schrittweite eingesetzt werden. Die Schrittweite darf nicht auf 0 gesetzt werden.
* eine ''Schrittweite'', die beim Zählen eingesetzt werden soll, diese ist optional und wird standardmäßig auf 1 gesetzt. Wenn die {{Python|range}} rückwärts zählen soll, muss eine negative Schrittweite eingesetzt werden. Die Schrittweite darf nicht auf 0 gesetzt werden.


Wird nur ein Parameter übergeben, wird dieser als Endwert interpretiert, zwei Parameter werden als Start- und Endwert interpretiert.
Wird nur ein Parameter übergeben, wird dieser als Endwert interpretiert, zwei Parameter werden als Start- und Endwert interpretiert.


Der übergebene Endwert wird ''nicht'' mitgezählt! Eine <code>range(0,5)</code> zählt also nur bis 4!
Der übergebene Endwert wird ''nicht'' mitgezählt! Eine {{Python|range(0,5)}} zählt also nur bis 4!


Betrachten wir das Verhalten einiger <code>range</code>s:
Betrachten wir das Verhalten einiger {{Python|range}}s:
 
<syntaxhighlight lang="pycon">
>>> list(range(10))
>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(3,7))
>>> list(range(3,7))
[3, 4, 5, 6]
[3, 4, 5, 6]
>>> list(range(2,18,3))
>>> list(range(2,18,3))
[2, 5, 8, 11, 14, 17]
[2, 5, 8, 11, 14, 17]
>>> list(range(3,-4,-1))
>>> list(range(3,-4,-1))
[3, 2, 1, 0, -1, -2, -3]
[3, 2, 1, 0, -1, -2, -3]
 
</syntaxhighlight>
Eine <code>for</code>-Wiederholung in Verbindung mit einer <code>range</code> lässt sich wie folgt als <code>while</code>-Wiederholung darstellen:
Eine {{Python|for}}-Wiederholung in Verbindung mit einer {{Python|range}} lässt sich wie folgt als {{Python|while}}-Wiederholung darstellen:
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
for x in range(start,finish,step):
for x in range(start,finish,step):
     do_some_stuff_with(x)
     do_some_stuff_with(x)
</syntaxhighlight>
</syntaxhighlight>
entspricht:<ref>Der Einfachheit und Lesbarkeit halber ist die <code>while</code>-Wiederholung hier nur für positive Schrittweiten dargestellt. Überleg mal: wie müsste man die Bedingung der <code>while</code>-Wiederholung anpassen, damit sie auch für negative Schrittweiten funktionieren würde?</ref>
entspricht:<ref>Der Einfachheit und Lesbarkeit halber ist die {{Python|while}}-Wiederholung hier nur für positive Schrittweiten dargestellt. Überleg mal: wie müsste man die Bedingung der {{Python|while}}-Wiederholung anpassen, damit sie auch für negative Schrittweiten funktionieren würde?</ref>
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
x = start
x = start
Zeile 184: Zeile 185:
     x = x + step
     x = x + step
</syntaxhighlight>
</syntaxhighlight>
Dass der Endwert, der einer <code>range</code> übergeben wird, nicht mitgezählt wird, hat durchaus Vorteile. Zum Beispiel kann man so die Länge einer Liste an eine <code>range</code> übergeben, die dann durch alle Indizes der Liste von 0 bis Länge-1 hochzählt.
Dass der Endwert, der einer {{Python|range}} übergeben wird, nicht mitgezählt wird, hat durchaus Vorteile. Zum Beispiel kann man so die Länge einer Liste an eine {{Python|range}} übergeben, die dann durch alle Indizes der Liste von 0 bis Länge-1 hochzählt.
 
== Fußnoten ==
<references/>

Aktuelle Version vom 7. Oktober 2024, 09:04 Uhr

Bedingte Verzweigung (if, elif, else)

Zur Realisierung einer Fallunterscheidung werden in Python die Schlüsselworte if, elif und else genutzt.

Bedingte Anweisung mit if

graph TD start["..."] --> if{"Bedingung"} -- ja --> teila["Teil A"] --> ende["..."] if -- nein --> ende

Der einfachste Fall ist eine Sequenz von Anweisungen, die nur dann ausgeführt werden soll, wenn eine bestimmte Bedingung erfüllt ist, sonst nicht. Die Schreibweise ist if Bedingung: und dann folgen die Anweisungen, die in dem Fall ausgeführt werden sollen, dass die Bedingung wahr ist. Diese Anweisungen müssen eingerückt werden, damit der Interpreter identifizieren kann, welche Anweisungen in Abhängigkeit von der Bedingung und welche immer ausgeführt werden sollen.

Im folgenden Beispiel wird die print-Anweisung nur ausgeführt, falls der Ausdruck (notendurchschnitt > 4) zu wahr (True) ausgewertet wird:

if notendurchschnitt > 4.0:
    # Teil A
    print('Die Klausur muss von der Schulleitung genehmigt werden.')

Bedingungen

Als Bedingung kann jeder Ausdruck eingesetzt werden, der zu True oder False ausgewertet werden kann. Hier werden also in der Regel logische Ausdrücke verwendet, zum Beispiel Vergleiche mit den Vergleichsoperatoren < (kleiner als), > (größer als) oder == (gleich).

Mehrere Vergleiche lassen sich mit den logischen Verknüpfungsoperatoren and (logisches UND) und or (logisches ODER) zu einer Bedingung verknüpfen. Im folgenden Beispiel wird die print-Anweisung ausgeführt, falls der Wert der Variablen notendurchschnitt größer als 4 oder kleiner als 1.5 ist (d. h. wenn mindestens einer der mit or verknüpften Vergleiche wahr ist):

if notendurchschnitt > 4.0 or notendurchschnitt < 1.5:
    # Teil A
    print('Die Klausur muss von der Schulleitung genehmigt werden.')

Werden Vergleiche dagegen mit and verknüpft, müssen alle einzelnen Vergleiche zu wahr ausgewertet werden, damit die Gesamtbedingung wahr ist:

if notendurchschnitt > 4.0 and anzahl_klausuren >= 2:
    # Teil A
    print('Die Klausur muss von der Schulleitung genehmigt werden.')

Alternative mit else

graph TD start["..."] --> if{"Bedingung"} -- ja --> teila["Teil A"] --> ende["..."] if -- nein --> teilB["Teil B"] --> ende

Um alternative Anweisungen auszuführen, wenn die Bedingung nicht erfüllt ist, wird das Schlüsselwort else: (engl. sonst) verwendet. Das else wird im Gegensatz zu den Anweisungen für den Dann- und den Sonst-Fall nicht eingerückt, steht also auf derselben Einrückungstiefe wie das if.

if notendurchschnitt > 4.0:
    # Teil A
    print('Die Klausur muss von der Schulleitung genehmigt werden.')
else:
    # Teil B
    print('Alles okay, die Klausur kannst du problemlos zurückgeben.')

Mehrfache bedingte Verzweigung mit elif

graph TD start["..."] --> if1{"Bedingung"} -- ja --> teila["Teil A"] --> ende["..."] if1 -- nein --> if2{"Bedingung"} -- ja --> teilB["Teil B"] --> ende if2 -- nein --> teilc["Teil C"] --> ende

Mit elif (kurz für else if) können mehrere Bedingungen nacheinander abgeprüft werden. In diesem Fall werden die Bedingungen solange abgeprüft, bis eine davon wahr ist. Nur die Anweisungen, die zu dieser Bedingung gehören werden dann ausgeführt.

Nach einem if können beliebig viele elifs folgen. Für den Fall, dass gar keine der abgeprüften Bedingungen wahr ist, kann nach den elifs ein else folgen.

if notendurchschnitt > 4.0:
    # Teil A
    print('Die Klausur muss von der Schulleitung genehmigt werden.')
elif notendurchschnitt > 2.0:
    print('Na, das ist doch ganz okay gelaufen.')
else:
    # Teil C
    print('Wow, das ist ja ein Hammer-Durchschnitt!')

Im obigen Beispiel würde ein Notendurchschnitt von 4.2 beide Bedingungen erfüllen, aber es würde nur der Text "Die Klausur muss von der Schulleitung genehmigt werden." ausgegeben werden, da die Auswertung nach dem ersten Auffinden einer erfüllten Bedingung endet.

Bedingte Wiederholung (while)

graph TD start["..."] --> while{"Bedingung"} -- ja --> teild["Teil D"] --> while -- nein --> ende["..."]

Um eine Anweisung oder eine Sequenz von Anweisungen in Abhängigkeit von einer Bedingung zu wiederholen, nutzen wir das Schlüsselwort while, welches genau so genutzt wird wie if: nach dem while folgt eine Bedingung, die erfüllt sein kann oder nicht, danach folgen, eingerückt, die Anweisungen, die so lange ausgeführt werden sollen, wie die Bedingung erfüllt ist.

Im folgenden Beispiel soll der Nutzer seine Postleitzahl eingeben. Die Eingabe wird geprüft und die Eingabeaufforderung wiederholt, solange wie keine Zahl eingegeben wurde:

plz = input('Bitte geben Sie Ihre Postleitzahl ein: ')
while not plz.isnumeric():
    # Teil C
    plz = input('Das ist keine Zahl. Bitte versuchen Sie es erneut: ')
⚠️
Achtung

Anders als in Scratch werden hier die Anweisungen nicht wiederholt, bis die Bedingung wahr ist, sondern solange sie wahr ist. Die folgenden Code-Schnipsel sind äquivalent:

while x >= 1:
    x = x - 1
    print(x)
wiederhole bis <(x) < [1]>
ändere [x v] um [-1]
sage (x)
ende

graph TD start["..."] --> teile["Teil E"] --> teile

Eine endlos laufende Wiederholung lässt sich realisieren, indem nach dem while eine immer wahre Bedingung gestellt wird:

while True:
    # Teil C
    print('Diese Wiederholung läuft ewig.')
   
while 1 == 1:
    # Teil C
    print('Diese theoretisch auch - praktisch wird sie nie gestartet, weil die Wiederholung davor endlos läuft.')

Auch eine endlos laufende Wiederholung kann aber mit dem Schlüsselwort break unterbrochen werden. Wenn mehrere Wiederholungen ineinander geschachtelt werden, wird dabei nur die innerste unterbrochen, in der sich die break-Anweisung befindet.

Dies kann vor allem nützlich sein, wenn die Abbruchbedingung der Wiederholung sehr komplex oder mehrstufig ist. In folgendem Beispiel soll der Nutzer seine Postleitzahl eingeben. Die Eingabe wird in zwei Schritten auf Korrektheit überprüft: zuerst wird mit isnumeric() geprüft, ob der eingegebene String plz nur aus Ziffern besteht; falls dies der Fall ist, wird überprüft, ob die eingegebene Zahl zwischen 01001 und 99998 liegt und damit eine gültige deutsche Postleitzahl sein könnte. Hierbei wird die Eingabe in ein int konvertiert, was bei einer nicht-numerischen Eingabe zu einer Fehlermeldung und dem Abbruch des Programms führen würde.

while True:
    plz = input('Bitte geben Sie Ihre Postleitzahl ein: ')
    if not plz.isnumeric():
        print('Sie haben keine Zahl eingegeben.')
    elif int(plz) < 1001 or int(plz) > 99998:
        print('Das ist keine gültige Postleitzahl.')
    else:
        break

Wiederholungen über eine Datenstruktur (for)

Das Schlüsselwort for kann man benutzen, um für alle Elemente in einer Datenstruktur dieselben Anweisungen auszuführen. Das kann eine Liste sein, ein String oder ähnliches. Die Syntax der Wiederholung ist for Element in Liste[1]: und danach folgen die Anweisungen, wieder eingerückt.

klassenliste = ['Max','Moritz','Paul','Paula','Enno','Enna','Jakob','Johannes','Lukas','Mats']
print('Moin. Wer fehlt heute?')
for kind in klassenliste:
    print(kind + ', bist du da?')

Wiederholungen mit fester Anzahl (range)

Für eine Wiederholung mit fester Anzahl, wie sie aus Scratch bekannt ist, kann die Datenstruktur range benutzt werden. Eine range zählt dabei von einem ggf. vorgegebenen Startwert zu einem vorgegebenen Endwert mit einer ggf. ebenfalls vorgegebenen Schrittweite hoch. Dies kann für eine for-Wiederholung genutzt werden. Der range können dabei bis zu drei Parameter übergeben werden:

  • ein Startwert, von wo die range zu zählen beginnen soll, dieser ist optional und wird standardmäßig auf 0 gesetzt
  • ein Endwert, bei dem die range aufgehört haben soll, zu zählen, dieser muss auf jeden Fall angegeben werden.
  • eine Schrittweite, die beim Zählen eingesetzt werden soll, diese ist optional und wird standardmäßig auf 1 gesetzt. Wenn die range rückwärts zählen soll, muss eine negative Schrittweite eingesetzt werden. Die Schrittweite darf nicht auf 0 gesetzt werden.

Wird nur ein Parameter übergeben, wird dieser als Endwert interpretiert, zwei Parameter werden als Start- und Endwert interpretiert.

Der übergebene Endwert wird nicht mitgezählt! Eine range(0,5) zählt also nur bis 4!

Betrachten wir das Verhalten einiger ranges:

>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(3,7))
[3, 4, 5, 6]
>>> list(range(2,18,3))
[2, 5, 8, 11, 14, 17]
>>> list(range(3,-4,-1))
[3, 2, 1, 0, -1, -2, -3]

Eine for-Wiederholung in Verbindung mit einer range lässt sich wie folgt als while-Wiederholung darstellen:

for x in range(start,finish,step):
    do_some_stuff_with(x)

entspricht:[2]

x = start
while x < finish:
    do_some_stuff_with(x)
    x = x + step

Dass der Endwert, der einer range übergeben wird, nicht mitgezählt wird, hat durchaus Vorteile. Zum Beispiel kann man so die Länge einer Liste an eine range übergeben, die dann durch alle Indizes der Liste von 0 bis Länge-1 hochzählt.

Fußnoten

  1. Statt einer Liste kann jede beliebige Datenstruktur verwendet werden, die iterierbar (engl. iterable) ist, d. h. es zulässt, eine Menge an Elementen in einer gewissen Reihenfolge durchzugehen.
  2. Der Einfachheit und Lesbarkeit halber ist die while-Wiederholung hier nur für positive Schrittweiten dargestellt. Überleg mal: wie müsste man die Bedingung der while-Wiederholung anpassen, damit sie auch für negative Schrittweiten funktionieren würde?