Syntax & Semantik
Wenn Code nicht funktioniert, gibt es zwei völlig unterschiedliche Gründe dafür. Diese Unterscheidung hilft dir, jeden Fehler schneller zu verstehen — nicht nur in Python.
Zwei Arten, wie ein Satz schiefgehen kann
Schau dir diese zwei deutschen Sätze an:
❌ Kaputt in der Form
„Ich gehe Schule zur."Die Wortstellung stimmt nicht. Man erkennt nicht einmal richtig, was gemeint ist — der Satz ist grammatikalisch ungültig.
⚠️ Falsch im Sinn
„Der Stein hat Hunger."Grammatikalisch völlig korrekt — aber inhaltlich sinnlos. Steine haben keinen Hunger.
Genau diese zwei Fehlerarten gibt es auch beim Programmieren — nur nennt man sie dort Syntaxfehler und Semantikfehler.
Fehler lesen: die Traceback-Anatomie
Wenn Python einen Fehler meldet, zeigt es eine Traceback genannte Meldung. Die letzte Zeile verrät die Fehlerart: SyntaxError heißt „Form kaputt", TypeError, IndexError oder AttributeError heißen „zur Laufzeit ist etwas inhaltlich schiefgegangen" — also Semantikfehler.
preis = "5" gesamt = preis * "2"
if x = 5:
print("gleich")
zahl = 5 zahl.append(3)
for i range(5):
print(i)
liste = [1, 2, 3] print(liste[5])
name = "Anna print(name)
Endpreis: 45.5 ausgegeben wird.preis = 50
rabatt = 4.5
if preis > rabatt:
endpreis = preis - rabatt
print("Endpreis:", endpreis)preis ist als Text statt als Zahl definiert. Ein einziger falscher Datentyp kann sich an mehreren Stellen im Code als Fehler zeigen.Variablen — kurz aufgefrischt
Nur eine schnelle Reaktivierung, kein neuer Stoff — danach geht's direkt weiter.
Zwei Werte tauschen — warum das nicht so einfach ist
Zwei Schüler stehen jeweils auf ihrem eigenen Stuhl und wollen die Plätze tauschen — ohne den Boden zu berühren. Auf jedem Stuhl ist nur Platz für einen Schüler. Keiner kann sich bewegen, ohne dass kurzzeitig zwei Schüler auf einem Stuhl stehen müssten — mit nur zwei Stühlen geht das schlicht nicht.
Die Lösung: ein dritter, freier Stuhl. Der erste Schüler steigt auf den dritten Stuhl. Jetzt ist sein ursprünglicher Stuhl frei, also steigt der zweite Schüler dorthin. Jetzt ist der andere Stuhl frei, also steigt der erste Schüler vom dritten Stuhl auf diesen. Fertig getauscht — mit Hilfe des dritten Stuhls. Genau dieses Problem gibt es auch bei Variablen — deshalb braucht man eine Hilfsvariable, quasi den dritten Stuhl.
a und b mit Hilfe einer Hilfsvariablen, sodass am Ende a den Wert 7 und b den Wert 3 hat.a = 3 b = 7 hilf = a a = b b = hilf print(a) print(b)
kontostand zweimal hintereinander um zinsen, ohne den Wert von zinsen zu verändern. Ausgabe am Ende: 110kontostand = 100 zinsen = 5 kontostand = kontostand + zinsen kontostand = kontostand + zinsen print(kontostand)
Datentypen — im Überblick
Vier Datentypen kennt ihr schon: Integer, Float, String, Boolean. Jeder speichert genau einen Wert — das sind einfache Datentypen. Heute kommt ein fünfter dazu, der anders funktioniert.
Eine Liste speichert nicht einen, sondern mehrere Werte, organisiert in einer festen Reihenfolge — deshalb zusammengesetzter Datentyp. In anderen Sprachen heißt das Konzept dahinter oft Array bzw. Reihung; in Python heißt es konkret list.
eingabe in eine Zahl um, um damit zu rechnen, und wandle alter in einen Text um, um ihn mit Text zu verketten.eingabe = "23" alter = 15 zahl = int(eingabe) print(zahl + 10) text = "Ich bin " + str(alter) + " Jahre alt" print(text)
"Ich bin " + alter einen TypeError verursachen — Text und Zahl lassen sich nicht direkt verketten, genau wie zu Beginn dieses Blocks besprochen.Zahlen — mehr als Grundrechenarten
Die Rechenoperatoren kennt ihr aus Klasse 8. Heute kommen zwei neue Werkzeuge dazu: die Quadratwurzel und der Zufall.
Bekannte Operatoren — kurz erinnert
| Operator | Bedeutung | Beispiel |
|---|---|---|
| + | Addition | preis + versand |
| − | Subtraktion | preis - rabatt |
| * | Multiplikation | preis * menge |
| / | Division | gesamt / anzahl |
| // | Ganzzahldivision | 17 // 5 → 3 |
| % | Rest der Division | 17 % 5 → 2 |
| ** | Potenz | 2 ** 3 → 8 |
Die vier Grundrechenarten reichen nicht für jede Rechnung. Um zum Beispiel bei einer quadratischen Gleichung die Lösung zu finden, braucht man die Quadratwurzel.
math ist eine Bibliothek — eine Sammlung fertiger Werkzeuge, die man mit import dazuholt, statt sie selbst zu schreiben.Bisher hat unser Code bei gleichen Eingaben immer dasselbe Ergebnis geliefert. Für Würfelspiele, Zufallsauswahl oder Simulationen braucht man aber echten Zufall.
x² − 3x + 2 = 0 mit der Mitternachtsformel: x = (−b ± √(b²−4ac)) / (2a). Nutze math.sqrt() für die Wurzel. Ausgabe: x1 = 2.0 und x2 = 1.0import math
a = 1
b = -3
c = 2
diskriminante = b**2 - 4*a*c
wurzel = math.sqrt(diskriminante)
x1 = (-b + wurzel) / (2*a)
x2 = (-b - wurzel) / (2*a)
print("x1 =", x1)
print("x2 =", x2)Listen — mehr Werkzeuge
append(), remove(), pop() und len() kennt ihr aus Klasse 8 schon. Hier kommen neue Werkzeuge dazu.
append() fügt einen Wert immer nur am Ende hinzu. Aber was, wenn ein neuer Wert mitten in die Liste soll — zum Beispiel weil er dort thematisch hingehört?insert(position, wert) fügt einen Wert an einer bestimmten Stelle ein — nicht nur am Ende wie append().sort() sortiert die Liste selbst (nicht nur die Ausgabe). reverse=True dreht die Richtung um.liste[start:ende] — der Startindex gehört dazu, der Endindex nicht. Lässt man eine Seite weg, bedeutet das "bis zum Anfang" bzw. "bis zum Ende".wartezeiten = [12, 4, 9, 21, 3, 15] print(wartezeiten[-3:]) wartezeiten.sort(reverse=True) print(wartezeiten)
Strings — wie kleine Listen
Ein String ist im Kern eine Liste von Zeichen — Index, Slicing und Länge funktionieren genauso, wie ihr's gerade bei Listen gelernt habt.
Auch bei Texten braucht man oft nicht das ganze Wort, sondern nur einen Ausschnitt — zum Beispiel nur den ersten Buchstaben oder eine bestimmte Länge.
ord() und chr() brauchen wir später noch einmal genauer — heute reicht, dass jedes Zeichen eine feste Zahl im Hintergrund hat."Sachsen" das erste Zeichen, das letzte Zeichen und die Länge aus.wort = "Sachsen" print(wort[0]) print(wort[-1]) print(len(wort))
Teste dein Wissen
Sechs Fragen zu allem, was in diesem Block dran war.
if x > 5 (ohne Doppelpunkt) verursacht welche Fehlerart?math.sqrt(49)?[10, 20, 30, 40][1:3] zurück?"Bautzen"[-1] zurück?zahl = 5 und danach zahl.append(3) — welche Fehlerart, und warum?Zum Nachdenken
„Bevor man einen Fehler behebt, muss man erst wissen, welche Art von Fehler man überhaupt vor sich hat."
Diskutiert in der Klasse: Warum könnte es einem beim Debuggen helfen, zuerst zu fragen "Syntax oder Semantik?", statt sofort loszuraten? Fällt euch ein Beispiel ein, bei dem ihr selbst einen dieser beiden Fehler gemacht habt?