====== Schleifenkonstruktionen und logische Ausdrücke ======
Source: [[https://python-lernen.com/schleifen/|python-lernen.de|python-lernen.com]]
--- //[[Karlheinz.Schubert@ksbg.ch|Karlheinz Schubert]] 2023/10/29 17:18//
===== Die while Schleife =====
Mit **Schleifen** kann man Programmteile (beliebig oft) wiederholen.
Wir könnten zum Beispiel einen Linienblatt ausgeben, indem wir 30 mal ''%%print('_' * 50)%%'' schreiben.
Besser ist aber eine Schleife zu verwenden. Dafür benötigen wir eine Hilfsvariable die wir hoch zählen (inkrementieren) werden. Diese Variable nennen wir ''%%ZeilenNr%%'' und initialisieren sie mit ''%%0%%''. Damit wir wissen, was die Zahl 30 bedeutet, schreiben wir diese in eine Variable mit einem //sprechenden Namen//: ''%%AnzahlLinien = 30%%''.
AnzahlLinien = 30
ZeilenNr = 0
while ZeilenNr < AnzahlLinien:
ZeilenNr += 1
print('_' * 50)
Nachdem wir die Variablen definiert und gesetzt haben, benutzen wir das **KeyWord** ''%%while%%'' und geben genauso wie bei den ''%%if%%'' Bedingungen einen Vergleich an.
Wir fragen, ob ''%%LinienNr%%'' kleiner als ''%%AnzahlLinien%%'' ist. Sollte das der Fall sein, wird der **Block** in der **Schleife** ausgeführt.
Im **Block** selbst geben wir unsere Zeile ''%%print('_'*50)%%'' aus und (sehr wichtig) erhöhen die ''%%LinienNur%%'' um ''%%1%%'': ''%%LinienNr += 1%%''. Sollten wir dies vergessen, so bleibt ''%%LinienNr%%'' immer ''%%0%%'' also kleiner als ''%%AnzahlLinien%%'' und die **Schleife** läuft ewig weiter.
===== Die for Schleife und die range() Funktion =====
Wollen wir eine Aktion n-mal wiederholen, so wie beim Linienblatt, kann man auch eine ''%%for%%'' **Schleife** verwenden. Diese benötigt keinen Inkrementor ''%%LinienNr += 1%%'', dafür aber die ''%%range()%%'' Funktion. Diese erwartet als Paramter eine Anzahl und gibt uns ein Range **Objekt** zurück. Was ein **Objekt** genau ist, interessiert uns momentan nicht. Wir können uns vorstellen, dass das Range **Objekt** uns eine List von Zahlen zurück gibt.
Also anstatt unserer Hilfsvariable ''%%LinienNr%%'' hoch zu zählen benutzen wir die ''%%range()%%'' Funktion mit unserem Zahlenbereich.
for ZeilenNr in range(30):
print('_' * 50)
Achtung die ''%%range(10)%%'' gibt den Zahlenbereich von ''%%0%%'' bis ''%%9%%'' zurück. Die **Schleife** läuft also 10 mal. Wenn wir ''%%ZeilenNr%%'' mit ausgeben, sehen wir aber das diese bei ''%%0%%'' beginnt und bei ''%%9%%'' endet.
===== Sprünge in Schleifen: break und continue =====
Es kann vorkommen das wir aus einer **Schleife** springen wollen und diese abrechen. Dafür verwenden wir das **break** statement.
for iIndex in range(10):
if Index == 5:
break
print("Hallo Welt")
In diesem Beispiel wird nur 5 mal, statt 10 mal “Hallo Welt” ausgegeben. Da sobald ''%%Index%%'' gleich 5 ist wir aus der **Schleife** springen.
for Index in range(10):
print(Index)
if Index % 2 == 0:
continue
print("Hallo Welt")
In diesem Beispiel geben wir die Zahlen von 0 bis 9 aus. Sollte i nicht ganzzahlig durch 2 geteilt werden können, geben wir “Hallo Welt” aus. Wenn i durch 2 glatt teilbar ist springen wir wieder zum Anfang der **Schleife** und überspringen somit das Ausgeben von “Hallo Welt”.
===== Der Modulo Operator % =====
Das ''%%%%%'' Zeichen ist ein ganz normaler Rechen-Operator wie ''%%+%%''oder ''%%*%%''. Das ''%%%%%'' steht für Modulo und gibt den Rest einer Ganzzahl-Division.
* ''%%3 % 2%%''ergibt also ''%%1%%''
* ''%%4 % 2%%'' ist ''%%0%%'', da kein Rest übrig bleibt.
===== Der Datentyp boolean =====
Sowohl bei den ''%%if%%'' , als auch bei den **Schleifen** Anweisungen haben entweder eine Variable oder eine (Un-)Gleichungen als Bedingung angegeben. Dies funktioniert, weil verschiedene Operatoren und Operationen in Python einen **booleschen** Wert zurückgeben.
print(42==42)
So gibt dieses ''%%print()%%'' einfach ein “True” aus.
Die beiden boolschen Werte ''%%True%%'' und ''%%False%%'' lassen sich auch direkt Variablen zuweisen:
Variable1 = False
Vairable2 = True
Ein boolscher Wert aber auch aus anderen Datentypen durch s.g. **casten** erzeugt werden:
bool(0) # False
bool(1) # True
bool(2) # True
bool("Hallo Welt") # True
bool("") # False
bool(1==2) # False
bool(1==1) # True
bool(1<2) # True
Dieses **casten** erfolgt in **Schleifen** und **if** Abfragen oft implizit. Daher können wir eine endlos Schleife so schreiben:
while 1:
print("Hey, bool(1) ist True!")
Diese Schleife läuft unendlich lange, da ''%%1%%'' immer ''%%True%%'' ist.
Im Terminal (Unix) bzw. im Command Fenster (Windows) kann man eine solche Endlosschleife mit ''%%Ctrl+C%%'' abrechen.
==== Boolsche Werte umkehren ====
Wenn wir überprüfen wollen ob etwas nicht der Fall ist können wir den **boolean** auch invertieren. Das machen wir indem wir ein ''%%not%%'' vor den **boolean** Wert schreiben.
b = False
if not b:
print("in dem if drin")
Das funktioniert natürlich auch mit den bereits bekannten Vergleichen.
Zahl = 42
if not Zahl == 43:
print("Die Zahl ist nicht 43")
==== Und und Oder ====
Es kommt durchaus mal vor das wir mehrere Bedingungen zusammen hängen wollen. Zum Beispiel das wir prüfen wollen ob die Zahl in einem gewissen Bereich ist.
for Index in range(100):
if Index > 50 and Index < 60:
print(Index)
Die **Schleife** selbst ist relativ trivial, sie zählt von ''%%0%%'' bis ''%%99%%''. Das Neue ist in dem Code im ''%%if%%'' Statement. Wenn ''%%Index%%'' größer (''%%>%%'') als ''%%50%%'' UND kleiner (''%%<%%'') als ''%%60%%'' ist, geben wir den ''%%Index%%'' aus.
Das Gleiche gibt es auch noch mit oder hier ist das **Keyword** ''%%or%%'':
Zahl = 1
if Zahl == 1 or Zahl == 42:
print("Zahl ist 1 oder 42")
Zahl = 42
if Zahl == 1 or Zahli == 42:
print("Zahl ist 1 oder 42")
In beiden Fällen haben wir die gleiche Abfrage und beide sind **Wahr** (''%%True%%'') obwohl wir ''%%Zahl%%'' im Laufe des Programmes überschreiben.
==== Boolean und Vergleichsperatoren ====
Verschiedene Operatoren die einen **booleschen** Wert zurückgeben:
print(True == True) # True
print(not True == True) # False
print(True == True and True == False) # False
print(True == True or True == False) # True
print(42 > 1) # True
print(42 < 1) # False
print(42 >= 1) # True
print("Hallo Welt" < "Hallo") # False
print("Hallo Welt" > "Hallo") # True
print("Hallo" == "Hallo") # True
===== Beispiel Python Taschenrechner =====
Jetzt kann man mit ''%%if%%'' Abfragen einen kleinen Python Rechner bauen. Durch eine While-Schleife führt er Berechnungen aus, bis man 'exit' eingibt:
print("\nMini-Calculator\n")
while True:
Operator = input('Welche Operation (+,-,*,/,^,exit): ')
Zahl1 = float(input('Zahl1: '))
Zahl2 = float(input('Zahl2: '))
Ergebnis = ''
if Operator == '+':
Ergebnis = Zahl1 + Zahl2
elif Operator == '-':
Ergebnis = Zahl1 - Zahl2
elif Operator == '/':
Ergebnis = Zahl1 / Zahl2
elif Operator == '*':
Ergebnis = Zahl1 * Zahl2
elif Operator == 'exit':
break
else:
print("Fehler: Die Eingabe konnte nicht interpretiert werden!")
print(f'{Zahl1} {Operator} {Zahl2} = {Ergebnis}')
print('Adieu.')
Wir fügen eine **nochmal** Variabel hinzu und geben ihr den Wert ''%%True%%'' . Gibt der Benutzer statt eines Rechen Operator ein ‘E’ ein setzten wir **nochmal** auf **False** . Was dazu führt das wir die Schleife verlassen und das Programm beendet wird.