====== - Grundlagen Programmieren in Python ====== ====== Programmieren II: Variablen, Verzweigungen, Schleifen ====== ===== - Variablen & Mathematik ===== Neben Turtlegrafik kann man in TigerJython und Python auch noch andere Dinge machen, die Spass machen, wie z.B. Mathe. *Tipp:* Möchtest du nur z.B. etwas berechnen, ohne dabei eine Turtle zu gebrauchen? Dann kannst du die zuvor immer benötigte Zeile Code `from gturtle import *` weglassen. ==== - Variablen ==== In **Variablen** werden Werte gespeichert, die man im Laufe des Programms lesen oder verändern will. Variablen haben einen Namen und einen Wert. Den Namen der Variable darf man frei wählen. Nicht erlaubt sind allerdings die Schüsselwörter (z.B. *from*, *repeat*, ...) und Namen mit Sonderzeichen. Variablen kannst du ganz einfach deklarieren: ` = ` Variablen haben jeweils einen **Typ**: * **Zahlen**: Mit Zahlen kann man rechnen. * Ein Text wird in der Informatik als **String** bezeichnet. In Python müssen Strings immer in Anführungs- und Schlusszeichen geschrieben werden. Zahlen sind keine Strings und benötigen deshalb keine Anführungs- und Schlusszeichen. Natürlich kann man mit Strings nicht rechnen. **Beispiele:** x = 7 # Zahl a = "Hallo, ich bin ein String!" # String **Versuche, von nun an möglichst möglichst viel mit Variablen zu arbeiten!** ==== - Einfache Rechnungen ==== Betrachte als Beispiel den folgenden Code: x = 7 y = x*x print(y) Im ersten Schritte legen wir eine Variable mit Namen `x` fest und weisen ihr den Wert 7 zu. Danach quadrieren wir die Zahl und speichern diesen Wert in einer zweiten Variable mit Namen `y`. Nun geben wir in der Konsole den Wert der Variable `y` (also 49) aus. Die **Konsole** (auch **Terminal**) ist das Fenster unterhalb des Code-Fensters. Um etwas in der Konsole auszugeben, schreiben wir dies in die `print(...)` Funktion. Führe diesen Code (selber schreiben, nicht copy-paste!) nun selbst aus. Weise der Variablen `x` nun einen anderen Wert zu. Damit wird dann auch der Wert der Variablen `y` verändert und dementsprechend sieht die Ausgabe im Terminal anders aus. Einige wichtige **mathematischen Operatoren** sind: ^ Funktion ^ Python-Code ^ | Addition | `7+3` | | Subtraktion | `7-3` | | Multiplikation | `7*3` | | Division (Nachkommastellen) | `7/3` | | Ganzzahldivision | `7//3` | | Hoch (z.B. 2 hoch 5) | `2**5` | | Wurzel (z.B. Wurzel von 2, sqrt für square-root) | `sqrt(2)` | | Modulo (Rest der Ganzzahl-Division, Bsp. `17%5 = 2`) | `17%2`| ==== - Eingabe ==== Man kann auch den Benutzer auffordern, eine Eingabe (Input) zu machen. Der eingegebene Wert kann dann in einer Variablen gespeichert werden: z = input("Gib eine Zahl ein:") Mit diesem Code wird der Benutzer aufgefordert, eine Zahl einzugeben. Sobald er dies gemacht hat, wird der eingetippte Wert in der Variablen `z` gespeichert. Diese kann danach z.B. dazu verwendet werden, um mit ihr etwas zu berechnen. Beachte, dass man in die `input()`-Funktion eine Anweisung schreiben kann. Um Sicherzustellen, dass es sich bei der Eingabe um den richtigen Datentyp wie zum Beispiel einen Integer (ganze Zahl) oder einen String (Text) handelt, kann man die Eingabe entsprechend **konvertieren**: z = int(input("Gib eine Zahl ein:")) s = str(input("Gib einen Text ein:")) Gibst du nun im ersten Beispiel anstelle einer Zahl ein Wort ein, so kann er dieses //nicht// in eine Zahl umwandeln und du erhältst eine Fehlermeldung. ==== - Formatierte Ausgaben ==== Betrachte nochmals den ersten Codeblock von diesem Kapitel. Dort wird eine Zahl in der Variablen `x` gespeichert. Danach weisen wir das Quadrat von `x` der Variablen `y` zu und geben diese aus. In der Konsole steht dann einfach 49. Wir hätten nun aber gerne, dass dort der Satz "Das Quadrat der Zahl 7 is 49" ausgegeben wird. Dies erreichen wir mit der folgenden Zeile Code: print("Das Quadrat der Zahl {0} is {1}".format(x,y)) In der print-Funktion schreiben wir in Anführungs- und Schlusszeichen den Satz, den wir gerne als Ausgabe hätten. Beachte, dass die beiden Zahlen *nicht* direkt in den String geschrieben werden. Stattdessen wollen wir, dass dort die Werte der Variablen `x` und `y` eingefügt werden. Dafür fügen wir an den richtigen Stellen die beiden Platzhalter `{0}` und `{1}` ein. An den String hängen wir dann den Befehl `.format(x,y)` an. Diese fügt für den ersten Platzhalter (`{0}`) den Wert der ersten Variablen (`x`) und für den zweiten Platzhalter (`{1}`) den Wert der zweiten Variablen (`y`) ein. ===== - Verzweigungen: if-else ===== Beim Programmieren kommt man oft in die Situation, wo man **Entscheidungen** treffen muss. Zum Beispiel soll, je nach dem was der Benutzer eintippt, ein anderer Code ausgeführt werden. Am einfachsten ist der sogenannte **if**-Befehl: Damit kann man überprüfen, ob (also //if//) eine gewisse Bedingung erfüllt ist oder nicht. Dieser Befehl hat die Form if BEDINGUNG: # Codeblock, falls BEDINGUNG erfüllt ist Es wird eine Bedingung überprüft. Falls diese erfüllt ist (und nur dann!), wird der darauffolgende Codeblock ausgeführt. Beachte: * Nach der Bedingung muss ein **Doppelpunkt** stehen. * Der nachfolgende Codeblock muss **eingerückt** (mit Tab) sein, wie bei der repeat- oder for-Schleife. **Bedingungen** können zum Beispiel sein: ^ Bedingung ^ **Erklärung** ^ | `x == 4` | x ist Zahl und hat Wert von genau 4 | | `s == "Hallo"` | s ist String und hat genau den Inhalt "Hallo" | | `x != 4` | x ist NICHT eine Zahl vom Wert | | `x > 5` | x ist Zahl grösser als 5 | | `x >= 5` | x ist Zahl grösser gleich 5 | | `x < 5` | x ist Zahl kleiner als 5 | | `x <= 5` | x ist Zahl kleiner gleich 5 | **Wichtig:** Beachte das **Doppelgleichzeichen** `==`. Eine Bedingung mit nur einem Gleichzeichen wie z.B. `x = 4` funktioniert nicht! Oft hat man die Situation, in der man zwischen zwei Situationen unterscheiden möchte: * Eine Bedingung wird erfüllt. * Eine Bedingung wird //nicht// erfüllt. Dies erreicht man mit einem **if-else**-Befehl (else: ansonsten): if BEDINGUNG: # Code, falls BEDINGUNG erfüllt ist else: # Code, falls BEDINGUNG nicht erfüllt ist Es gibt auch die Situation, in der man verschiedene Bedingungen überprüfen möchte. Je nachdem, welche Bedingung erfüllt wird, wird ein anderer Codeblock ausgeführt. Ein solcher **if-elif-else**-Befehl hat die Form: if BEDINGUNG1: # Code, falls BEDINGUNG1 erfüllt ist. elif BEDINGUNG2: # Code, falls BEDINGUNG2 erfüllt ist, aber nicht BEDINGUNG1. else: # Code, falls keine der Bedingungen erfüllt ist. Bemerkungen: * Man kann beliebig viele //elif//-Befehle hintereinanter haben. * Falls die Bedingung bei //if// erfüllt ist, werden alle //elif//s gar nicht mehr überprüft! * Gleiches gilt für //elif//s: Sobald die Bedingung von einem //elif// erfüllt wird, werden alle //elif//s weiter unten ignoriert. ==== - Beispiel ==== Wir wollen ein Programm schreiben, in dem der Benutzer eine Zahl eintippen soll. Der Code soll dann entscheiden, ob die Zahl positiv oder negativ ist und eine entsprechende Message ausgeben: x = input("Tippe eine Zahl ein:") if x >= 0: print("Die Zahl {0} ist positiv.".format(x)) else: print("Die Zahl {0} ist negativ.".format(x)) Tippe dieses Beispiel ab (nicht einfach copy paste!) und führe es aus. Versuche dann, jede Zeile genau zu verstehen: Schauen wir uns dies etwas genauer an: `if x >= 0` überprüft, ob die Zahl grösser gleich 0 ist. Falls ja wird der darauffolgende print-Befehl ausgeführt, in dem mitgeteilt wird, dass die Zahl positiv ist. Falls die Bedingung `if x >= 0` //nicht// erfüllt ist, muss die Zahl also negativ sein. Deshalb wird in diesem Fall der print-Befehl nach dem //else// ausgeführt. ===== - While-Schleife ===== Oft wollen wir einen Schritt mehrmals wiederholen. Dies können wir mit einer **while-Schleife** (dt. //während//) umsetzen. Diese hat folgende Form: ... while BEDINGUNG: ... # Dieser Codeblock wird solange ausgefuehrt, ... # wie die BEDINGUNG True (also erfuellt) ist ... # Dieser Code wird ausgefuehrt ... # sobald die BEDINGUNG nicht mehr erfuellt ist Die Bedingungen schreibt man gleich wie für for-Schleifen, also `==, >, >=, ...` **Beispiel:** Im folgenden Programm wird man aufgefordert, eine positive Zahl einzugeben. Man kann solange weiterspielen, bis man etwas eingibt, was //keine// positive Zahl ist, also z.B. eine negative Zahl oder Text. x = input("Gib eine positive Zahl ein:") while x > 0: x = input("Gib eine positive Zahl ein:") print("Game Over! Du hast etwas eingegeben, was keine positive Zahl ist.") Tippe diesen Code ab, führe ihn aus und stelle sicher, dass du jede Zeile verstehst. Falls wir einen Codeblock so oft ausführen wollen, bis der Benutzer abbricht, können wir eine **Endlosschleife** erzeugen. Wir schreiben dazu eine while-Schleife mit einer Bedingung, die //immer// erfüllt ist. Eine Möglichkeit wäre `7==7`, einfacher ist es aber, einfach `True` zu schreiben: ... while True: ... # Dieser Code wird solange ausgeführt, bis der Benutzer abbricht ... # Dieser Code wird NIE erreicht Eine Möglichkeit gibt es aber, aus eine Schleife wie der oberen (`while True: ...`) auszubrechen: Wird der Befehl `break` aufgerufen, wird die **Schleife umgehend abgebrochen** und der Code unterhalb wird ausgeführt.