MINT lernen

Typische Fehler — was oft schiefgeht

Die zwölf Fehler, die beim Programmieren mit Python am häufigsten passieren — jeweils mit Richtigstellung und Merksatz.

Hier sind die 12 häufigsten Fehler beim Programmieren mit Python. Lies sie durch — wer einen Fehler kennt, findet ihn im eigenen Programm und in der Klassenarbeit viel schneller.

!

Die 12 häufigsten Fehler

1Der Text steht ohne Anführungszeichen

So wird es oft gemacht: print(Hallo) — Python sucht eine Variable namens Hallo und meldet NameError: name 'Hallo' is not defined

Richtig ist: print("Hallo") — Text steht immer in Anführungszeichen. Ohne Anführungszeichen ist es ein Name (Variable, Funktion).

Text in Anführungszeichen, Namen ohne.

2Mit der Eingabe wird direkt gerechnet

falsch
alter = input("Alter? ")print(alter + 1)
Alter? 14
TypeError: can only concatenate str (not "int") to str
richtig
alter = int(input("Alter? "))print(alter + 1)
Alter? 14
15
Eingabe jeweils 14

So wird es oft gemacht: alter = input("Alter? ") und danach alter + 1 — TypeError, weil Text und Zahl nicht addiert werden können

Richtig ist: alter = int(input("Alter? ")) — int() macht aus dem Text „14“ die Zahl 14. Für Kommazahlen nimmt man float().

input gibt Text, int macht eine Zahl daraus.

3Kommazahlen mit Komma geschrieben

falsch
preis = 1,75print(preis * 2)
(1, 75, 1, 75)
richtig
preis = 1.75print(preis * 2)
3.5
links: kein Fehler, aber falsches Ergebnis

So wird es oft gemacht: preis = 1,75 — Python meldet keinen Fehler, speichert aber zwei Zahlen 1 und 75. Die Rechnung liefert Unsinn.

Richtig ist: preis = 1.75 — in Python ist der Punkt das Dezimaltrennzeichen, das Komma trennt Werte.

Kommazahlen schreibt Python mit Punkt.

4Das Ergebnis von / wird als ganze Zahl benutzt

So wird es oft gemacht: range(n / 2) oder liste[n / 2] — / liefert immer einen float, z. B. 4.0, und range kann damit nicht zählen

Richtig ist: range(n // 2) — // teilt ganzzahlig. Ob eine Zahl gerade ist, prüft man mit n % 2 == 0.

/ gibt immer float, // gibt int.

5In der Bedingung steht nur ein Gleichheitszeichen

So wird es oft gemacht: if punkte = 10: — Python meldet einen SyntaxError

Richtig ist: if punkte == 10: — == vergleicht und liefert True oder False, = speichert einen Wert in einer Variablen.

Ein = gibt, zwei == fragen.

6Doppelpunkt oder Einrückung fehlt

So wird es oft gemacht: while x < 5 ohne Doppelpunkt (SyntaxError) oder der Block darunter ist nicht eingerückt (IndentationError)

Richtig ist: while x < 5: und darunter alle Zeilen, die wiederholt werden sollen, um vier Leerzeichen eingerückt. Das gilt genauso für if, elif, else, for und def.

Kein Block ohne Doppelpunkt und Einrückung.

7Die weite Bedingung steht vor der engen

falsch
alter = 8if alter < 18:    print("Jugendtarif")elif alter < 12:    print("Kindertarif")
Jugendtarif
richtig
alter = 8if alter < 12:    print("Kindertarif")elif alter < 18:    print("Jugendtarif")
Kindertarif
alter = 8: nur rechts stimmt der Tarif

So wird es oft gemacht: Erst if alter < 18:, dann elif alter < 12: — jedes Kind ist auch jünger als 18, der elif-Zweig läuft nie

Richtig ist: Die engere Bedingung zuerst prüfen: erst alter < 12, dann alter < 18. Python führt nur den ersten wahren Zweig aus.

Bei elif gehört das Engere nach oben.

8Nach or fehlt der zweite Vergleich

So wird es oft gemacht: if farbe == "rot" or "blau": — die Bedingung ist immer wahr, auch bei „grün“, weil rechts von or nur der Text "blau" steht

Richtig ist: if farbe == "rot" or farbe == "blau": — auf beiden Seiten von and und or steht ein vollständiger Vergleich.

or und and verbinden ganze Vergleiche.

9Die Schleifenvariable ändert sich nicht

falsch
n = 1while n < 5:    print(n)
1
1
1
… (endlos)
richtig
n = 1while n < 5:    print(n)    n = n + 1
1
2
3
4
links hört die Ausgabe nie auf

So wird es oft gemacht: while n < 5: mit print(n) im Block, aber n wird nie erhöht — die Bedingung bleibt für immer wahr

Richtig ist: Im Block muss sich die Variable der Bedingung ändern: n = n + 1. Läuft ein Programm trotzdem endlos, hilft der Stopp-Knopf.

Was die Bedingung prüft, muss sich im Block ändern.

10range zählt angeblich bis zum Stoppwert

So wird es oft gemacht: for i in range(1, 10): soll die Zahlen 1 bis 10 liefern — die 10 fehlt aber

Richtig ist: range(1, 11) liefert 1 bis 10. range(5) liefert 0, 1, 2, 3, 4 — fünf Werte, aber ohne die 5.

Der Stoppwert von range gehört nie dazu.

11Das letzte Element hat den Index len

falsch
tage = ["Mo", "Di", "Mi"]print(tage[3])
IndexError: list index out of range
richtig
tage = ["Mo", "Di", "Mi"]print(tage[2], tage[-1])
Mi Mi
drei Elemente: Index 0, 1, 2

So wird es oft gemacht: tage[3] bei einer Liste mit drei Elementen — IndexError, weil es Index 3 nicht gibt

Richtig ist: Die Indizes laufen von 0 bis len(tage) - 1. Das letzte Element erreicht man sicher mit tage[-1]. Dasselbe gilt für Zeichenketten.

Der Index beginnt bei 0 und endet bei len − 1.

12Die Funktion gibt ihr Ergebnis nur aus

falsch
def quadrat(x):    print(x * x)erg = quadrat(4)print(erg)
16
None
richtig
def quadrat(x):    return x * xerg = quadrat(4)print(erg)
16
links landet None in erg

So wird es oft gemacht: In der Funktion steht print(x * x) — der Wert erscheint zwar, aber erg bekommt None

Richtig ist: return x * x — erst return gibt den Wert an die aufrufende Stelle zurück, wo man ihn speichern und weiterverwenden kann.

print zeigt an, return gibt zurück.