Skip to content

Kapitel 20: Häufige Fehler und Fallen

🎯 Lernziele

In diesem Kapitel wirst du:

  • Die häufigsten Fehler in Python kennenlernen
  • Fallen (Pitfalls) in Python verstehen
  • Best Practices zur Fehlervermeidung erlernen
  • Tipps und Tricks für Anfänger erhalten

20.1 Häufige Syntaxfehler (Syntax Errors)

❌ Fehler 1: Falsche Einrückung (IndentationError)

python
# Falsch
if True:
print("Hallo")  # IndentationError!

# Richtig
if True:
    print("Hallo")  # 4 Leerzeichen einrücken

❌ Fehler 2: Doppelpunkt vergessen (SyntaxError)

python
# Falsch
if True  # SyntaxError!
    print("Hallo")

# Richtig
if True:  # Doppelpunkt nicht vergessen!
    print("Hallo")

❌ Fehler 3: Uneinheitliche Einrückung (IndentationError)

python
# Falsch (Leerzeichen und Tabs gemischt)
if True:
    print("Zeile 1")
	print("Zeile 2")  # Tab verwendet!

# Richtig (immer 4 Leerzeichen)
if True:
    print("Zeile 1")
    print("Zeile 2")  # 4 Leerzeichen

❌ Fehler 4: Klammern oder Anführungszeichen nicht geschlossen (SyntaxError)

python
# Falsch
print("Hallo)  # SyntaxError!

# Richtig
print("Hallo")  # Anführungszeichen geschlossen

20.2 Häufige Laufzeitfehler (Runtime Errors)

❌ Fehler 5: Nicht definierte Variable verwenden (NameError)

python
# Falsch
print(meine_variable)  # NameError!

# Richtig
meine_variable = 10
print(meine_variable)

❌ Fehler 6: Falscher Datentyp (TypeError)

python
# Falsch
zahl = 10
print("Meine Zahl ist: " + zahl)  # TypeError!

# Richtig
zahl = 10
print("Meine Zahl ist: " + str(zahl))
# Oder
print(f"Meine Zahl ist: {zahl}")  # f-string (empfohlen!)

❌ Fehler 7: Durch 0 teilen (ZeroDivisionError)

python
# Falsch
zahl = 10 / 0  # ZeroDivisionError!

# Richtig
zahl = 10
if zahl != 0:
    ergebnis = 10 / zahl
    print(ergebnis)
else:
    print("Fehler: Division durch 0!")

❌ Fehler 8: Index außerhalb des Bereichs (IndexError)

python
# Falsch
meine_liste = [1, 2, 3]
print(meine_liste[5])  # IndexError!

# Richtig
meine_liste = [1, 2, 3]
if len(meine_liste) > 5:
    print(meine_liste[5])
else:
    print("Index außerhalb des Bereichs!")

❌ Fehler 9: Schlüssel nicht in Wörterbuch (KeyError)

python
# Falsch
mein_dict = {"a": 1, "b": 2}
print(mein_dict["c"])  # KeyError!

# Richtig (Methode 1: get() verwenden)
mein_dict = {"a": 1, "b": 2}
wert = mein_dict.get("c", "Nicht gefunden")
print(wert)  # Nicht gefunden

# Richtig (Methode 2: "in" verwenden)
if "c" in mein_dict:
    print(mein_dict["c"])
else:
    print("Schlüssel nicht gefunden!")

20.3 Häufige Logikfehler (Logic Errors)

❌ Fehler 10: == und = verwechseln

python
# Falsch (Zuweisung anstelle von Vergleich)
x = 5
if x = 10:  # SyntaxError!
    print("x ist 10")

# Richtig
x = 5
if x == 10:  # Vergleich
    print("x ist 10")

❌ Fehler 11: Flaschen Vergleich mit is und ==

python
# Falsch (is vergleicht Identität, nicht Wert!)
a = [1, 2, 3]
b = [1, 2, 3]
print(a is b)  # False (verschiedene Objekte)
print(a == b)  # True (gleiche Werte)

# Richtig
a = [1, 2, 3]
b = [1, 2, 3]
if a == b:  # Werte vergleichen
    print("Listen haben gleiche Werte")

❌ Fehler 12: Veränderbare Standardargumente (Mutable Default Arguments)

python
# Falsch (gefährlich!)
def meiene_funktion(liste=[]):  # Leere Liste als Standardargument
    liste.append(1)
    return liste

print(meiene_funktion())  # [1]
print(meiene_funktion())  # [1, 1] (unerswartet!)

# Richtig
def meiene_funktion(liste=None):
    if liste is None:
        liste = []
    liste.append(1)
    return liste

print(meiene_funktion())  # [1]
print(meiene_funktion())  # [1] (wie erwartet!)

20.4 Häufige Fallen (Pitfalls)

⚠️ Falle 1: Veränderbare Datentypen (Mutable vs. Immutable)

python
# Unerswartetes Verhalten
liste1 = [1, 2, 3]
liste2 = liste1  # Referenz, nicht Kopie!
liste2.append(4)
print(liste1)  # [1, 2, 3, 4] (unerswartet!)

# Richtig (Kopie erstellen)
liste1 = [1, 2, 3]
liste2 = liste1.copy()  # Oder liste1[:]
liste2.append(4)
print(liste1)  # [1, 2, 3] (wie erwartet!)

⚠️ Falle 2: Schleifen-Variable (Loop Variable Leakage)

python
# Überraschung in Python 2 (nicht in Python 3)
for i in range(5):
    pass
print(i)  # 4 (in Python 2 unerswartet, in Python 3 OK)

⚠️ Falle 3: range() und len() (Off-by-One Error)

python
# Falsch (IndexError!)
meine_liste = [1, 2, 3]
for i in range(len(meine_liste)):
    print(meine_liste[i])

# Besser
meine_liste = [1, 2, 3]
for element in meine_liste:
    print(element)

# Oder wenn Index benötigt wird
for i, element in enumerate(meine_liste):
    print(i, element)

⚠️ Falle 4: import und Namenskonflikte

python
# Falsch (Namenskonflikt)
from math import *
print(sqrt(4))  # Funktioniert
# Aber: Was ist mit anderen Modulen?

# Besser
import math
print(math.sqrt(4))

# Oder
from math import sqrt
print(sqrt(4))

20.5 Best Practices zur Fehlervermeidung

✅ Tipps für Anfänger

  1. Verwende eine IDE mit Syntax-Highlighting und Linter

    • PyCharm, VS Code, etc.
  2. Schreibe klaren, lesbaren Code

    • Befolge PEP 8 Style Guide
    • Verwende aussagekräftige Variablennamen
  3. Teste deinen Code regelmäßig

    • Verwende print() zum Debuggen (anfangs)
    • Lerne einen Debugger zu verwenden (später)
  4. Behandle Ausnahmen (Exceptions) ordnungsgemäß

    • Verwende try-except-Blöcke
    • Behandle spezifische Ausnahmen, nicht allgemeine Exception
  5. Sei vorsichtig mit veränderbaren Datentypen

    • Sei dir bewusst, wenn du Referenzen kopierst
    • Verwende .copy() oder deepcopy(), wenn nötig

💡 Tipps und Tricks

python
# 1. Tupel-Entpackung (Tuple Unpacking)
a, b = 1, 2
print(a, b)  # 1 2

# 2. Mehrfache Zuweisung
a = b = c = 0
print(a, b, c)  # 0 0 0

# 3. Werte tauschen (ohne temporäre Variable)
a, b = 1, 2
a, b = b, a
print(a, b)  # 2 1

# 4. "in" Operator verwenden
if x in [1, 2, 3]:
    print("Gefunden!")

# 5. Listen-Abstraktion (List Comprehension)
quadrate = [x**2 for x in range(10)]
print(quadrate)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

# 6. "enumerate()" verwenden
for i, element in enumerate(["a", "b", "c"]):
    print(i, element)
# Ausgabe:
# 0 a
# 1 b
# 2 c

# 7. "zip()" verwenden
namen = ["Alice", "Bob", "Charlie"]
alter = [25, 30, 35]
for name, alter in zip(namen, alter):
    print(f"{name} ist {alter} Jahre alt.")
# Ausgabe:
# Alice ist 25 Jahre alt.
# Bob ist 30 Jahre alt.
# Charlie ist 35 Jahre alt.

📝 Zusammenfassung

In diesem Kapitel hast du gelernt:

  • ✅ Häufige Syntaxfehler zu vermeiden
  • ✅ Häufige Laufzeitfehler zu vermeiden
  • ✅ Häufige Logikfehler zu vermeiden
  • ✅ Häufige Fallen (Pitfalls) in Python zu verstehen
  • ✅ Best Practices zur Fehlervermeidung anzuwenden

🎯 Übung

  1. Schreibe ein Programm, das eine Liste von Zahlen enthält, und berechne ihren Durchschnitt (Mittelwert). Behandle mögliche Fehler (z.B. leere Liste).
  2. Schreibe ein Programm, das ein Wörterbuch mit Studentennamen und ihren Noten enthält, und gib die Noten für einen bestimmten Studenten aus. Behandle den Fall, dass der Student nicht im Wörterbuch ist.
  3. Schreibe ein Programm, das eine verschachtelte Liste (Liste von Listen) enthält, und greife auf bestimmte Elemente zu. Achte auf IndexError.
  4. Schreibe ein Programm, das eine Funktion mit einem veränderbaren Standardargument enthält, und korrigiere den Fehler.

⏭️ Nächstes Kapitel

In Kapitel 21 werden wir Python-Projekte erstellen - wende dein Wissen in der Praxis an!

Frei für alle Anfänger