====== 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.