Appearance
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 geschlossen20.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
Verwende eine IDE mit Syntax-Highlighting und Linter
- PyCharm, VS Code, etc.
Schreibe klaren, lesbaren Code
- Befolge PEP 8 Style Guide
- Verwende aussagekräftige Variablennamen
Teste deinen Code regelmäßig
- Verwende
print()zum Debuggen (anfangs) - Lerne einen Debugger zu verwenden (später)
- Verwende
Behandle Ausnahmen (Exceptions) ordnungsgemäß
- Verwende
try-except-Blöcke - Behandle spezifische Ausnahmen, nicht allgemeine
Exception
- Verwende
Sei vorsichtig mit veränderbaren Datentypen
- Sei dir bewusst, wenn du Referenzen kopierst
- Verwende
.copy()oderdeepcopy(), 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
- Schreibe ein Programm, das eine Liste von Zahlen enthält, und berechne ihren Durchschnitt (Mittelwert). Behandle mögliche Fehler (z.B. leere Liste).
- 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.
- Schreibe ein Programm, das eine verschachtelte Liste (Liste von Listen) enthält, und greife auf bestimmte Elemente zu. Achte auf IndexError.
- 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!
