Python Grundkurs
Von der ersten Zeile Code bis zu Web Scraping und Objektorientierung β dein kompletter Python-Einstieg.
Glossar
Alle wichtigen Python-Begriffe auf einen Blick β von Variable bis Vererbung.
Einleitung & Setup
Du installierst Python auf deinem Computer, lernst die Python-Konsole kennen und schreibst dein allererstes Programm.
Python ist eine der beliebtesten Programmiersprachen der Welt. Sie wird in der Webentwicklung, Datenanalyse, künstlichen Intelligenz und Automatisierung eingesetzt. Python wurde bewusst so entworfen, dass der Code leicht lesbar ist – fast wie normales Englisch. Das macht Python zur idealen Sprache für den Einstieg in die Programmierung.
Python ist kostenlos, läuft auf Windows, Mac und Linux und hat eine riesige Community. Wenn du einmal nicht weiterweißt, findest du fast immer eine Lösung im Internet.
Bevor du programmieren kannst, brauchst du Python auf deinem Computer. Die Installation dauert nur wenige Minuten.
Windows
https://www.python.org/downloads/Add python.exe to PATH ganz unten im Installationsfenster!Wenn du den Haken bei Add python.exe to PATH vergisst, kann dein Computer den Befehl python später nicht finden. Falls das passiert: Deinstalliere Python und installiere es erneut – diesmal mit Haken.
Mac
Auf macOS ist häufig eine ältere Python-Version vorinstalliert. Lade trotzdem die aktuelle Version von python.org herunter und installiere sie – genau wie bei Windows.
IDLE ist ein einfacher Editor, der automatisch mit Python installiert wird. Er eignet sich perfekt für den Einstieg, weil du sofort Code eingeben und ausführen kannst.
IDLE.>>>. Das ist die Python-Konsole – hier kannst du direkt Code eingeben.Stell dir die Konsole wie einen Taschenrechner vor: Du tippst etwas ein, drückst Enter, und Python antwortet sofort. Perfekt zum Ausprobieren!
Der Befehl print() gibt Text auf dem Bildschirm aus. Er ist der einfachste und wichtigste Befehl zum Starten.
print("Hallo Welt!") Tippe genau diesen Befehl in die IDLE-Konsole ein und drücke Enter. Python gibt aus:
Hallo Welt! Herzlichen Glückwunsch – du hast gerade dein erstes Python-Programm geschrieben!
print() ist eine Funktion – ein eingebauter Befehl, der etwas tut. Die Anführungszeichen "..." markieren einen String (eine Zeichenkette). Python gibt den Text zwischen den Anführungszeichen aus.
Die Konsole ist praktisch zum Testen, aber für längere Programme erstellst du eine Datei. So geht’s in IDLE:
Strg+S). Wähle einen Namen wie hallo.py. Die Endung .py ist wichtig!F5). Die Ausgabe erscheint in der Shell.# Mein erstes Python-Skript
print("Hallo Welt!")
print("Ich lerne Python.")
print("Das macht Spass!") Python kann rechnen! Probiere folgende Eingaben in der Konsole aus:
>>> 5 + 3
8
>>> 10 - 4
6
>>> 3 * 7
21
>>> 20 / 4
5.0 | Operator | Bedeutung | Beispiel | Ergebnis |
|---|---|---|---|
+ | Addition | 5 + 3 | 8 |
- | Subtraktion | 10 - 4 | 6 |
* | Multiplikation | 3 * 7 | 21 |
/ | Division | 20 / 4 | 5.0 |
** | Potenz | 2 ** 3 | 8 |
// | Ganzzahl-Division | 7 // 2 | 3 |
% | Rest (Modulo) | 7 % 2 | 1 |
Wenn du einen Tippfehler machst, zeigt Python eine Fehlermeldung. Kopiere die Fehlermeldung und frage eine KI: „Erkläre mir diese Python-Fehlermeldung auf Deutsch, Schritt für Schritt: [Fehlermeldung einfügen]“
Ohne Python auf deinem Computer kannst du nicht programmieren. Diese Aufgabe stellt sicher, dass alles korrekt eingerichtet ist.
https://www.python.org/downloads/ herunter.Add python.exe to PATH zu setzen.IDLE. Starte IDLE (Python 3.x).>>> – die Python-Eingabeaufforderung.Lösungshinweise anzeigen
Du siehst ein Fenster mit Text wie Python 3.12.x ... und darunter >>>. Wenn du 1 + 1 eingibst und Enter drückst, antwortet Python mit 2. Dann funktioniert alles.
Mit print() kannst du beliebige Texte ausgeben. So kommuniziert dein Programm mit der Außenwelt.
print()-Befehle untereinander, jeweils mit einem anderen Text in Anführungszeichen.begruessung.py mit File → Save.F5).print() geschrieben hast.Falls du eine Fehlermeldung wie SyntaxError siehst: Prüfe, ob du die Anführungszeichen um den Text nicht vergessen hast. Richtig: print("Hallo"). Falsch: print(Hallo).
Lösungshinweise anzeigen
Dein Code könnte so aussehen:
print("Hallo!")
print("Ich heiße Python.")
print("Schön, dich kennenzulernen.") In der Shell erscheinen drei Zeilen mit deinen Texten.
Du kannst Python jederzeit als Taschenrechner verwenden – ideal, um die Grundrechenarten und Operatoren kennenzulernen.
100 + 250 ein und drücke Enter. Du solltest 350 sehen.2 ** 10 (2 hoch 10). Erwartet: 1024.17 // 3 (Ganzzahl-Division). Erwartet: 5.17 % 3 (Rest der Division). Erwartet: 2.Lösungshinweise anzeigen
// teilt und rundet auf die nächste ganze Zahl ab: 17 geteilt durch 3 ergibt 5 Rest 2. % gibt genau diesen Rest zurück.
Du willst wissen, was Python noch kann? Frage eine KI: „Zeige mir 5 einfache Python-Befehle für Anfänger, die ich in der IDLE-Konsole ausprobieren kann. Erkläre jeden Befehl in einem Satz.“
Zahlen, Variablen & Strings
Du lernst, wie Python mit Zahlen und Text umgeht, wie du Werte in Variablen speicherst und wie du Eingaben vom Benutzer entgegennimmst.
Jeder Wert in Python hat einen Typ. Die drei wichtigsten Typen für den Anfang sind:
| Typ | Bedeutung | Beispiel |
|---|---|---|
int | Ganze Zahl (ohne Komma) | 42, -7, 0 |
float | Kommazahl (mit Dezimalpunkt) | 3.14, -0.5 |
str | String (Text, Zeichenkette) | "Hallo", 'Python' |
Python verwendet den Punkt als Dezimalzeichen: 3.14 – nicht 3,14. Das Komma hat in Python eine andere Bedeutung (es trennt z. B. Werte in Listen).
Du kannst den Typ eines Werts mit type() herausfinden:
print(type(42)) # <class 'int'>
print(type(3.14)) # <class 'float'>
print(type("Hallo")) # <class 'str'> Eine VariableEin benannter Speicherplatz, in dem du einen Wert ablegen kannst – wie ein beschriftetes Gefäß. ist wie ein beschriftetes Gefäß: Du gibst ihr einen Namen und füllst sie mit einem Wert. Später kannst du den Wert über den Namen wieder abrufen.
name = "Anna"
alter = 30
groesse = 1.72
print(name) # Anna
print(alter) # 30
print(groesse) # 1.72 Regeln für Variablennamen
| Erlaubt | Nicht erlaubt |
|---|---|
mein_name | mein-name (Bindestrich) |
alter2 | 2alter (beginnt mit Zahl) |
_privat | mein name (Leerzeichen) |
Verwende sprechende Namen: alter statt a, preis statt x. So verstehst du deinen Code auch noch in einer Woche.
Du kannst den Wert einer Variable jederzeit überschreiben:
punkte = 10
print(punkte) # 10
punkte = punkte + 5
print(punkte) # 15 Zusätzlich gibt es abgekürzte Schreibweisen:
| Langform | Kurzform | Bedeutung |
|---|---|---|
x = x + 5 | x += 5 | 5 dazuaddieren |
x = x - 2 | x -= 2 | 2 abziehen |
x = x * 3 | x *= 3 | Verdreifachen |
x = x / 2 | x /= 2 | Halbieren |
Ein StringEine Zeichenkette – also Text in Anführungszeichen. Kann Buchstaben, Zahlen und Sonderzeichen enthalten. ist Text in Anführungszeichen. Du kannst einfache '...' oder doppelte "..." verwenden:
vorname = "Max"
nachname = 'Mustermann'
# Strings verbinden (Konkatenation)
ganzer_name = vorname + " " + nachname
print(ganzer_name) # Max Mustermann f-Strings – Variablen in Text einbauen
Die eleganteste Art, Variablen in einen Text einzubauen, sind f-Strings. Setze ein f vor die Anführungszeichen und schreibe Variablen in geschweifte Klammern:
name = "Anna"
alter = 30
print(f"Hallo, ich bin {name} und {alter} Jahre alt.")
# Hallo, ich bin Anna und 30 Jahre alt. Mit input() kannst du den Benutzer nach einer Eingabe fragen. Die Eingabe wird immer als String zurückgegeben:
name = input("Wie heisst du? ")
print(f"Hallo, {name}!") Auch wenn der Benutzer eine Zahl eingibt, ist das Ergebnis ein String! Wenn du damit rechnen willst, musst du umwandeln: alter = int(input("Dein Alter: "))
Manchmal musst du einen Wert von einem Typ in einen anderen umwandeln:
# String zu Zahl
text = "42"
zahl = int(text) # 42 als Ganzzahl
komma = float(text) # 42.0 als Kommazahl
# Zahl zu String
zahl = 100
text = str(zahl) # "100" als Text Wenn du eine Fehlermeldung wie TypeError: can only concatenate str to str bekommst, frage eine KI: „Ich bekomme diesen Python-Fehler: [Fehlermeldung]. Erkläre mir einfach, was falsch ist und wie ich es behebe.“
Variablen sind das Fundament jedes Programms. Hier übst du, Werte zu speichern und auszugeben.
steckbrief.py.name und weise ihr deinen Namen als String zu, z. B. name = "Max".alter mit deinem Alter als Ganzzahl (int).hobby mit einem deiner Hobbys als String.print(f"Ich bin {name}, {alter} Jahre alt. Mein Hobby: {hobby}")F5. Du solltest deinen Steckbrief als eine Zeile in der Shell sehen.Lösungshinweise anzeigen
Die Ausgabe sieht z. B. so aus: Ich bin Max, 35 Jahre alt. Mein Hobby: Kochen. Achte darauf, dass alter ohne Anführungszeichen zugewiesen wird (Zahl, nicht String).
In echten Programmen kommen Werte oft vom Benutzer. Hier übst du input() und Typumwandlung.
geburtsjahr.py.eingabe = input("In welchem Jahr bist du geboren? ")geburtsjahr = int(eingabe)alter = 2026 - geburtsjahrprint(f"Du bist ungefaehr {alter} Jahre alt.")1990). Du solltest sehen: Du bist ungefaehr 36 Jahre alt.Wenn du statt einer Zahl einen Buchstaben eingibst, stürzt das Programm mit einem ValueError ab. Das ist normal – in Modul 11 lernst du, wie du solche Fehler abfängst.
Lösungshinweise anzeigen
Der wichtigste Punkt: input() gibt immer einen String zurück. Ohne int() würdest du versuchen, von einer Zahl einen Text abzuziehen – das geht nicht.
Zu wissen, welchen Typ ein Wert hat, hilft dir bei der Fehlersuche. Hier übst du type().
type(42) ein und drücke Enter. Erwartet: <class 'int'>.type(3.14) ein. Erwartet: <class 'float'>.type("42") ein. Erwartet: <class 'str'> – obwohl es wie eine Zahl aussieht!type(True) ein. Erwartet: <class 'bool'>. Booleans lernst du in Modul 04 genauer kennen.Lösungshinweise anzeigen
Der Unterschied zwischen 42 und "42" ist entscheidend: Ersteres ist eine Zahl (int), mit der du rechnen kannst. Letzteres ist ein Text (str) – Python würde "42" + "42" zu "4242" zusammenfügen, nicht zu 84!
Wenn du mehr üben willst, frage eine KI: „Gib mir 3 einfache Python-Übungsaufgaben zum Thema Variablen und Datentypen für Anfänger. Zeige die Lösung erst, wenn ich danach frage.“
Listen & Daten umwandeln
Du lernst, wie du mehrere Werte in einer Liste sammelst, Elemente hinzufügst oder entfernst und Datentypen gezielt umwandelst.
Stell dir eine ListeEine geordnete Sammlung von Werten in eckigen Klammern. Jedes Element hat eine Position (Index), die bei 0 beginnt. wie eine Einkaufsliste vor: Du schreibst mehrere Einträge untereinander, und jeder Eintrag hat eine feste Position. In Python schreibst du Listen in eckigen Klammern:
farben = ["rot", "blau", "gruen"]
zahlen = [10, 20, 30, 40]
gemischt = ["Hallo", 42, 3.14, True]
print(farben) # ['rot', 'blau', 'gruen'] Eine Liste kann Strings, Zahlen, Booleans und sogar andere Listen enthalten. Für den Anfang verwendest du am besten Listen mit Elementen des gleichen Typs.
Jedes Element in einer Liste hat eine Nummer – den Index. Wichtig: Python beginnt bei 0 zu zählen!
tiere = ["Hund", "Katze", "Vogel", "Fisch"]
print(tiere[0]) # Hund (erstes Element)
print(tiere[1]) # Katze (zweites Element)
print(tiere[-1]) # Fisch (letztes Element) | Element | Index von vorne | Index von hinten |
|---|---|---|
"Hund" | 0 | -4 |
"Katze" | 1 | -3 |
"Vogel" | 2 | -2 |
"Fisch" | 3 | -1 |
Wenn du auf einen Index zugreifst, der nicht existiert (z. B. tiere[10] bei nur 4 Elementen), bekommst du einen IndexError. Prüfe im Zweifel die Länge mit len(tiere).
Anders als Strings sind Listen veränderbar (mutable). Du kannst Elemente hinzufügen, entfernen und ändern:
Elemente hinzufügen
einkauf = ["Brot", "Milch"]
einkauf.append("Eier") # Am Ende anhaengen
print(einkauf) # ['Brot', 'Milch', 'Eier']
einkauf.insert(1, "Butter") # An Position 1 einfuegen
print(einkauf) # ['Brot', 'Butter', 'Milch', 'Eier'] Elemente entfernen
einkauf.remove("Milch") # Bestimmtes Element entfernen
print(einkauf) # ['Brot', 'Butter', 'Eier']
letztes = einkauf.pop() # Letztes Element entfernen und zurueckgeben
print(letztes) # Eier Elemente ändern und sortieren
noten = [3, 1, 4, 2]
noten[0] = 5 # Erstes Element aendern
print(noten) # [5, 1, 4, 2]
noten.sort() # Aufsteigend sortieren
print(noten) # [1, 2, 4, 5]
noten.sort(reverse=True) # Absteigend sortieren
print(noten) # [5, 4, 2, 1] | Funktion / Methode | Was sie tut | Beispiel |
|---|---|---|
len(liste) | Anzahl der Elemente | len([1,2,3]) → 3 |
liste.append(x) | x am Ende anhängen | l.append("neu") |
liste.insert(i, x) | x an Position i einfügen | l.insert(0, "vorne") |
liste.remove(x) | Erstes Vorkommen von x entfernen | l.remove("alt") |
liste.pop() | Letztes Element entfernen & zurückgeben | x = l.pop() |
liste.sort() | Liste sortieren | l.sort() |
liste.reverse() | Reihenfolge umkehren | l.reverse() |
x in liste | Prüfen, ob x enthalten ist | "Hund" in tiere → True |
Du hast in Modul 02 bereits int(), float() und str() kennengelernt. Hier kommen weitere Umwandlungen dazu:
# String in Liste umwandeln
buchstaben = list("Python")
print(buchstaben) # ['P', 'y', 't', 'h', 'o', 'n']
# String aufteilen (split)
satz = "Ich lerne Python"
woerter = satz.split()
print(woerter) # ['Ich', 'lerne', 'Python']
# Liste zu String verbinden (join)
zusammen = " - ".join(woerter)
print(zusammen) # Ich - lerne - Python split() macht aus einem String eine Liste, join() macht aus einer Liste einen String. Zusammen sind sie extrem nützlich für Textverarbeitung.
Wenn du dir unsicher bist, was eine Listen-Methode genau macht, frage eine KI: „Erkläre mir die Python-Methode .insert() an einem einfachen Beispiel. Was passiert mit den anderen Elementen?“
Listen sind ideal, um Sammlungen von Daten zu verwalten. Hier erstellst du eine Einkaufsliste und veränderst sie.
einkauf.py in IDLE.einkauf = ["Brot", "Milch", "Kaese"]einkauf.append("Butter") ein weiteres Produkt hinzu."Milch" mit einkauf.remove("Milch").print(einkauf). Erwartet: ['Brot', 'Kaese', 'Butter']print(len(einkauf)). Erwartet: 3Lösungshinweise anzeigen
append() fügt immer am Ende an, remove() sucht das erste Vorkommen und entfernt es. Die Reihenfolge der verbleibenden Elemente bleibt erhalten.
Sortieren ist eine der häufigsten Operationen mit Listen. Hier übst du sort() und len().
noten.py.noten = [3, 1, 5, 2, 4, 2]print("Unsortiert:", noten)noten.sort()print("Sortiert:", noten). Erwartet: [1, 2, 2, 3, 4, 5]print("Beste Note:", noten[0]). Erwartet: 1Lösungshinweise anzeigen
sort() verändert die Liste dauerhaft. Nach dem Sortieren steht die kleinste Zahl am Anfang (Index 0). Wenn du die Originalliste behalten willst, nutze sorted(noten) – das gibt eine neue Liste zurück, ohne die alte zu verändern.
Die Umwandlung zwischen Strings und Listen ist eine häufige Aufgabe bei der Textverarbeitung.
woerter.py.satz = "Python macht Programmieren einfach"woerter = satz.split()print(woerter). Erwartet: ['Python', 'macht', 'Programmieren', 'einfach']print("Woerter:", len(woerter)). Erwartet: 4Lösungshinweise anzeigen
split() ohne Argument trennt am Leerzeichen. Du kannst auch andere Trennzeichen angeben, z. B. "a,b,c".split(",") ergibt ['a', 'b', 'c'].
Wenn du mehr Praxis brauchst, frage eine KI: „Gib mir eine Python-Aufgabe, bei der ich eine Liste mit 5 Namen erstellen, sortieren und das dritte Element ausgeben muss. Prüfe meine Lösung, wenn ich sie dir zeige.“
Kontrollstrukturen: if/else & Booleans
Du lernst, wie dein Programm Entscheidungen trifft – abhängig von Bedingungen führt es unterschiedlichen Code aus.
Ein BooleanEin Datentyp mit genau zwei möglichen Werten: True (wahr) oder False (falsch). Wird für Bedingungen und Entscheidungen verwendet. ist der einfachste Datentyp in Python: Er kennt nur zwei Werte – True (wahr) und False (falsch). Stell dir einen Lichtschalter vor: an oder aus, nichts dazwischen.
ist_sonnig = True
regnet_es = False
print(type(ist_sonnig)) # <class 'bool'> True und False werden in Python immer mit großem Anfangsbuchstaben geschrieben. true oder TRUE funktionieren nicht und erzeugen einen Fehler.
Vergleichsoperatoren vergleichen zwei Werte und liefern True oder False zurück:
| Operator | Bedeutung | Beispiel | Ergebnis |
|---|---|---|---|
== | Gleich? | 5 == 5 | True |
!= | Ungleich? | 5 != 3 | True |
> | Größer? | 5 > 3 | True |
< | Kleiner? | 5 < 3 | False |
>= | Größer oder gleich? | 5 >= 5 | True |
<= | Kleiner oder gleich? | 3 <= 5 | True |
= ist die Zuweisung (Wert speichern). == ist der Vergleich (Werte vergleichen). x = 5 speichert 5 in x. x == 5 fragt: „Ist x gleich 5?“
Mit if kannst du Code nur dann ausführen, wenn eine Bedingung wahr ist:
alter = 20
if alter >= 18:
print("Du bist volljaehrig.") Python erkennt zusammengehörigen Code an der Einrückung (4 Leerzeichen oder 1 Tab). Alles, was eingerückt unter dem if steht, gehört zum if-Block. Vergisst du die Einrückung, bekommst du einen IndentationError.
Mit else legst du fest, was passiert, wenn die Bedingung nicht erfüllt ist:
alter = 15
if alter >= 18:
print("Du bist volljaehrig.")
else:
print("Du bist minderjaehrig.") Genau einer der beiden Blöcke wird immer ausgeführt – nie beide.
Mit elif (kurz für „else if“) kannst du weitere Bedingungen prüfen:
note = 2
if note == 1:
print("Sehr gut!")
elif note == 2:
print("Gut!")
elif note == 3:
print("Befriedigend.")
elif note <= 5:
print("Noch bestanden.")
else:
print("Nicht bestanden.") Python prüft die Bedingungen von oben nach unten. Sobald eine zutrifft, wird der zugehörige Block ausgeführt und der Rest übersprungen.
Du kannst Bedingungen kombinieren:
| Operator | Bedeutung | Beispiel |
|---|---|---|
and | Beide müssen wahr sein | alter >= 18 and alter <= 65 |
or | Mindestens eine muss wahr sein | tag == "Sa" or tag == "So" |
not | Dreht wahr/falsch um | not ist_sonnig |
alter = 25
hat_ausweis = True
if alter >= 18 and hat_ausweis:
print("Einlass gewaehrt.")
else:
print("Kein Einlass.") Statt if hat_ausweis == True: schreibst du einfach if hat_ausweis:. Das liest sich fast wie Englisch: „Wenn hat Ausweis, dann ...“
Wenn dein if/elif/else-Block unübersichtlich wird, frage eine KI: „Vereinfache diesen Python-Code mit if/elif/else. Erkläre, was du geändert hast: [Code einfügen]“
Programme müssen oft Entscheidungen treffen. Hier baust du eine einfache Altersprüfung.
alter_check.py.alter = int(input("Wie alt bist du? "))alter >= 18, gib "Du darfst waehlen." aus. Sonst: "Du darfst noch nicht waehlen."20 ein. Erwartet: Du darfst waehlen.15 ein. Erwartet: Du darfst noch nicht waehlen.Lösungshinweise anzeigen
Achte auf den Doppelpunkt nach if alter >= 18: und else: – den vergisst man leicht. Außerdem muss der Code unter if und else eingerückt sein.
Mit elif kannst du mehrere Stufen abfragen – perfekt für Notenberechnungen oder Rabattsysteme.
noten_rechner.py.punkte = int(input("Wie viele Punkte (0-100)? "))"Sehr gut", ab 75 → "Gut", ab 60 → "Befriedigend", ab 50 → "Ausreichend", sonst → "Nicht bestanden".print(f"Bei {punkte} Punkten: {note}")95 → Sehr gut, 80 → Gut, 40 → Nicht bestanden.Prüfe immer vom höchsten Wert nach unten! Wenn du zuerst punkte >= 50 prüfst, würden auch 95 Punkte als „Ausreichend“ gelten – weil Python beim ersten Treffer aufhört.
Lösungshinweise anzeigen
Die Reihenfolge ist entscheidend: if punkte >= 90: kommt zuerst, dann elif punkte >= 75: usw. Am Ende steht else: für alle Werte unter 50.
Mit and und or kannst du komplexere Bedingungen formulieren – wichtig für reale Programme.
5 > 3 and 10 > 7 ein. Erwartet: True (beide sind wahr).5 > 3 and 10 < 7 ein. Erwartet: False (eine ist falsch).5 > 3 or 10 < 7 ein. Erwartet: True (eine reicht bei or).not True ein. Erwartet: False.Lösungshinweise anzeigen
and ergibt nur True, wenn beide Seiten wahr sind. or ergibt True, wenn mindestens eine Seite wahr ist. not dreht den Wert um.
Frage eine KI: „Gib mir ein Alltagsbeispiel für if/elif/else in Python – zum Beispiel einen Fahrkartenautomaten oder eine Wetter-App. Ich bin Anfänger.“
Kontrollstrukturen: Schleifen
Du lernst, wie du Code wiederholt ausführen lässt – mit while und for. Schleifen sind das Werkzeug, um Aufgaben zu automatisieren.
Stell dir vor, du willst die Zahlen 1 bis 100 ausgeben. Ohne Schleife bräuchtest du 100 print()-Befehle. Mit einer Schleife reichen 2 Zeilen. Schleifen wiederholen einen Codeblock, solange eine Bedingung erfüllt ist – oder für jedes Element einer Liste.
Die while-Schleife wiederholt Code, solange eine Bedingung wahr ist:
zaehler = 1
while zaehler <= 5:
print(f"Durchlauf {zaehler}")
zaehler += 1
print("Fertig!") Ausgabe:
Durchlauf 1
Durchlauf 2
Durchlauf 3
Durchlauf 4
Durchlauf 5
Fertig! Wenn du vergisst, den Zähler zu erhöhen (zaehler += 1), bleibt die Bedingung immer wahr und die Schleife läuft endlos. Drücke Strg+C in der Konsole, um eine Endlosschleife abzubrechen.
Die for-Schleife geht eine Sammlung (z. B. eine Liste) Element für Element durch:
fruechte = ["Apfel", "Banane", "Kirsche"]
for frucht in fruechte:
print(f"Ich mag {frucht}") Ausgabe:
Ich mag Apfel
Ich mag Banane
Ich mag Kirsche Verwende for, wenn du weißt, wie oft du wiederholen willst (Liste, Zahlenbereich). Verwende while, wenn du nicht weißt, wie oft – z. B. „wiederhole, bis der Benutzer ‘quit’ eingibt“.
Mit range() erzeugst du eine Folge von Zahlen – perfekt für for-Schleifen:
# Zahlen 0 bis 4
for i in range(5):
print(i) # 0, 1, 2, 3, 4
# Zahlen 1 bis 5
for i in range(1, 6):
print(i) # 1, 2, 3, 4, 5
# Jede zweite Zahl von 0 bis 10
for i in range(0, 11, 2):
print(i) # 0, 2, 4, 6, 8, 10 | Aufruf | Erzeugt | Erklärung |
|---|---|---|
range(5) | 0, 1, 2, 3, 4 | Startet bei 0, endet vor 5 |
range(1, 6) | 1, 2, 3, 4, 5 | Startet bei 1, endet vor 6 |
range(0, 11, 2) | 0, 2, 4, 6, 8, 10 | Schrittweite 2 |
range(5) erzeugt 0 bis 4 – nicht 0 bis 5! Wenn du 1 bis 10 willst, schreibst du range(1, 11).
Mit break springst du sofort aus der Schleife heraus. Mit continue überspringst du den Rest des aktuellen Durchlaufs und machst mit dem nächsten weiter:
# break: Bei 5 aufhoeren
for i in range(1, 11):
if i == 5:
break
print(i) # 1, 2, 3, 4
# continue: Ungerade ueberspringen
for i in range(1, 11):
if i % 2 != 0:
continue
print(i) # 2, 4, 6, 8, 10 Du kannst Schleifen ineinander setzen. Die innere Schleife läuft für jeden Durchlauf der äußeren komplett durch:
for zeile in range(1, 4):
for spalte in range(1, 4):
print(f"{zeile}x{spalte}={zeile*spalte}", end=" ")
print() # Neue Zeile Ausgabe:
1x1=1 1x2=2 1x3=3
2x1=2 2x2=4 2x3=6
3x1=3 3x2=6 3x3=9 Wenn du nicht verstehst, warum eine Schleife ein bestimmtes Ergebnis liefert, frage eine KI: „Gehe diesen Python-Code Schritt für Schritt durch und zeige mir den Wert jeder Variable in jedem Durchlauf: [Code einfügen]“
while-Schleifen sind ideal für Zähler und Wiederholungen mit unbekannter Anzahl. Hier baust du einen einfachen Countdown.
countdown.py.zahl = 10while zahl > 0:zahl aus und verringere sie um 1 (zahl -= 1).print("Start!")10, 9, 8, ... 1, Start! sehen.Lösungshinweise anzeigen
Die Schleife läuft, solange zahl > 0. Bei zahl = 0 ist die Bedingung falsch und Python springt zu print("Start!"). Vergisst du zahl -= 1, läuft die Schleife endlos!
for-Schleifen mit range() eignen sich perfekt zum Durchlaufen von Zahlenbereichen. Hier berechnest du eine Summe.
summe.py.summe = 0for i in range(1, 11):summe += iprint(f"Summe von 1 bis 10: {summe}")Summe von 1 bis 10: 55Lösungshinweise anzeigen
summe startet bei 0. In jedem Durchlauf wird i dazuaddiert: 0+1=1, 1+2=3, 3+3=6, ... bis 45+10=55. range(1, 11) erzeugt 1 bis 10.
Eine while-Schleife mit break ist das Muster für „wiederhole, bis der Benutzer etwas Bestimmtes eingibt“.
passwort.py.geheim = "python123"while True: für eine Endlosschleife.eingabe = input("Passwort: ")if eingabe == geheim: → gib "Zugang gewaehrt!" aus und schreibe break.else-Block: print("Falsches Passwort. Versuche es erneut.")python123. Die Schleife sollte erst beim richtigen Passwort enden.Lösungshinweise anzeigen
while True: läuft endlos – der einzige Ausweg ist break. Das ist ein gängiges Muster für Benutzereingabe-Schleifen: „Frage solange, bis die Eingabe stimmt.“
Funktionen
Du lernst, wie du eigene Funktionen erstellst, um Code wiederverwendbar und übersichtlich zu machen.
Stell dir vor, du musst an 10 Stellen in deinem Programm eine Begrüßung ausgeben. Ohne Funktionen kopierst du den Code 10 Mal. Mit einer FunktionEin wiederverwendbarer Codeblock, den du mit einem Namen aufrufst. Definiert mit def. schreibst du den Code einmal und rufst ihn beliebig oft auf.
Eine Funktion definierst du mit def, gefolgt vom Namen und Klammern:
def begruessung():
print("Hallo und willkommen!")
print("Schoen, dass du da bist.")
# Funktion aufrufen
begruessung()
begruessung() # Kann beliebig oft aufgerufen werden def begruessung(): definiert die Funktion (erstellt den Bauplan). begruessung() ruft sie auf (führt den Code aus). Ohne Aufruf passiert nichts! Die Funktion muss immer vor dem Aufruf definiert sein.
Parameter machen Funktionen flexibel. Du übergibst Werte, mit denen die Funktion arbeitet:
def begruessung(name):
print(f"Hallo, {name}!")
begruessung("Anna") # Hallo, Anna!
begruessung("Max") # Hallo, Max! Mehrere Parameter
def steckbrief(name, alter, stadt):
print(f"{name} ist {alter} Jahre alt und wohnt in {stadt}.")
steckbrief("Anna", 30, "Berlin") Standardwerte (Default-Parameter)
def begruessung(name, sprache="de"):
if sprache == "de":
print(f"Hallo, {name}!")
else:
print(f"Hello, {name}!")
begruessung("Anna") # Hallo, Anna! (Standard: de)
begruessung("Max", "en") # Hello, Max! print() gibt Text auf dem Bildschirm aus, aber der Wert geht „verloren“. Mit return gibt die Funktion einen Wert zurück, den du weiterverwenden kannst:
def addiere(a, b):
ergebnis = a + b
return ergebnis
summe = addiere(5, 3)
print(summe) # 8
# Direkt verwenden
print(addiere(10, 20)) # 30 print() zeigt etwas an – wie ein Bildschirm. return gibt etwas zurück – wie eine Antwort. Wenn du das Ergebnis einer Funktion weiterverarbeiten willst (in Variablen speichern, in Berechnungen nutzen), brauchst du return.
Variablen, die innerhalb einer Funktion erstellt werden, existieren nur dort – das nennt man lokalen Scope:
def meine_funktion():
nachricht = "Ich bin lokal"
print(nachricht) # Funktioniert
meine_funktion()
# print(nachricht) # FEHLER! nachricht existiert hier nicht Variablen außerhalb von Funktionen sind global und können überall gelesen (aber nicht verändert) werden:
gruss = "Hallo" # Global
def zeige_gruss():
print(gruss) # Liest die globale Variable
zeige_gruss() # Hallo Eine Funktion kann sich selbst aufrufen – das nennt man Rekursion. Das klassische Beispiel ist die Fakultät (5! = 5 × 4 × 3 × 2 × 1 = 120):
def fakultaet(n):
if n <= 1:
return 1
return n * fakultaet(n - 1)
print(fakultaet(5)) # 120 Rekursion ist ein fortgeschrittenes Konzept. Für den Anfang reicht es zu wissen, dass es existiert. Die meisten Aufgaben löst du einfacher mit Schleifen.
Wenn du merkst, dass du Code kopierst, frage eine KI: „Ich habe diesen Python-Code, der sich wiederholt. Zeige mir, wie ich daraus eine Funktion mache: [Code einfügen]“
Funktionen machen Code wiederverwendbar. Hier erstellst du deine erste eigene Funktion mit Parameter.
funktionen.py.def hallo(name):print(f"Hallo, {name}! Willkommen bei Python.")Lösungshinweise anzeigen
Achte darauf, dass der print()-Befehl eingerückt unter def steht. Die Aufrufe stehen nicht eingerückt unter der Funktion.
Funktionen mit return geben Werte zurück, die du weiterverwenden kannst – das Grundprinzip für jedes größere Programm.
rechner.py.def addiere(a, b): mit return a + bmultipliziere(a, b) mit return a * b.summe = addiere(10, 5)print(f"10 + 5 = {summe}"). Erwartet: 10 + 5 = 15print(multipliziere(addiere(2, 3), 4)). Erwartet: 20Lösungshinweise anzeigen
Im letzten Schritt wird zuerst addiere(2, 3) ausgeführt (ergibt 5), dann multipliziere(5, 4) (ergibt 20). So kannst du Funktionsaufrufe verschachteln.
Default-Parameter machen Funktionen flexibler, weil nicht jeder Parameter beim Aufruf angegeben werden muss.
rabatt.py.def berechne_preis(preis, rabatt=10):return zurück: return preis - (preis * rabatt / 100)print(berechne_preis(100)). Erwartet: 90.0 (Standard: 10%)print(berechne_preis(100, 25)). Erwartet: 75.0 (25% Rabatt)Lösungshinweise anzeigen
Wenn du rabatt beim Aufruf nicht angibst, verwendet Python den Standardwert 10. Gibst du einen Wert an, wird der Standard überschrieben. Parameter mit Standardwert müssen immer nach Parametern ohne Standardwert stehen.
Frage eine KI: „Zeige mir 3 Beispiele für nützliche Python-Funktionen im Alltag – z. B. Temperatur umrechnen, Trinkgeld berechnen oder BMI berechnen. Ich bin Anfänger.“
Dateien & CSV
Du lernst, wie du Dateien liest, schreibst und CSV-Dateien (Tabellendaten) mit Python verarbeitest.
Bisher gehen alle Daten verloren, sobald dein Programm endet. Mit Dateien kannst du Daten dauerhaft speichern – egal ob Texte, Ergebnisse oder Einstellungen. Das ist die Grundlage für praktisch jedes reale Programm.
Das Schlüsselwort with öffnet eine Datei und schließt sie automatisch, wenn du fertig bist. Das ist die sicherste Methode:
with open("meine_datei.txt", "r") as datei:
inhalt = datei.read()
print(inhalt) | Modus | Bedeutung | Datei muss existieren? |
|---|---|---|
"r" | Lesen (read) | Ja |
"w" | Schreiben (write) – überschreibt! | Nein (wird erstellt) |
"a" | Anhängen (append) | Nein (wird erstellt) |
Zeile für Zeile lesen
with open("meine_datei.txt", "r") as datei:
for zeile in datei:
print(zeile.strip()) # strip() entfernt Zeilenumbrueche Jede Zeile aus einer Datei hat am Ende einen unsichtbaren Zeilenumbruch (\n). strip() entfernt ihn – sonst bekommst du leere Zeilen in der Ausgabe.
# Neue Datei erstellen / ueberschreiben
with open("ausgabe.txt", "w") as datei:
datei.write("Zeile 1\n")
datei.write("Zeile 2\n")
# An bestehende Datei anhaengen
with open("ausgabe.txt", "a") as datei:
datei.write("Zeile 3\n") Wenn du eine existierende Datei mit "w" öffnest, wird der gesamte Inhalt gelöscht und neu geschrieben. Verwende "a" (append), wenn du etwas anhängen willst.
CSV (Comma-Separated Values) ist ein verbreitetes Format für Tabellendaten. Python hat ein eingebautes csv-Modul dafür:
CSV lesen
import csv
with open("daten.csv", "r") as datei:
leser = csv.reader(datei)
for zeile in leser:
print(zeile) # Jede Zeile ist eine Liste CSV schreiben
import csv
daten = [
["Name", "Alter", "Stadt"],
["Anna", "30", "Berlin"],
["Max", "25", "Hamburg"]
]
with open("personen.csv", "w", newline="") as datei:
schreiber = csv.writer(datei)
for zeile in daten:
schreiber.writerow(zeile) Beim Schreiben von CSV-Dateien auf Windows fügst du newline="" hinzu, damit keine doppelten Leerzeilen entstehen.
Wenn deine Datei Umlaute oder Sonderzeichen enthält, kann es zu Problemen kommen. Verwende dann encoding="utf-8":
with open("deutsch.txt", "r", encoding="utf-8") as datei:
inhalt = datei.read()
print(inhalt) Wenn du beim Öffnen einer Datei eine UnicodeDecodeError-Meldung bekommst, frage eine KI: „Ich bekomme beim Lesen einer Datei einen UnicodeDecodeError in Python. Wie finde ich heraus, welches Encoding meine Datei hat?“
Dateien lesen und schreiben ist die Grundlage für jede Anwendung, die Daten speichern muss.
tagebuch.py.tagebuch.txt erstellt und 3 Zeilen hineinschreibt (Modus "w").\n zu beenden."r" und gib den Inhalt aus.tagebuch.txt im gleichen Ordner erstellt wurde.Lösungshinweise anzeigen
Erst schreibst du mit with open("tagebuch.txt", "w") as f: und dann liest du mit with open("tagebuch.txt", "r") as f:. Die Datei findest du im gleichen Ordner wie dein Python-Skript.
CSV-Dateien sind das Standardformat für Tabellendaten – du kannst sie auch in Excel oder Google Sheets öffnen.
kontakte.py.import csvkontakte.csv mit csv.writer.csv.reader und gib jede Zeile aus.kontakte.csv auch mit einem Texteditor, um das CSV-Format zu sehen.Lösungshinweise anzeigen
Die CSV-Datei sieht im Texteditor so aus: Name,Telefon,Email in der ersten Zeile, dann z. B. Anna,0123456,anna@email.de. Jede Zeile beim Lesen ist eine Liste: ['Anna', '0123456', 'anna@email.de'].
Frage eine KI: „Ich möchte mit Python eine Textdatei durchsuchen und alle Zeilen ausgeben, die ein bestimmtes Wort enthalten. Zeige mir den Code Schritt für Schritt.“
Listen vertieft: Slicing, Comprehension, Dictionaries & Tupel
Du vertiefst dein Wissen über Listen und lernst drei weitere Datenstrukturen kennen, die in Python allgegenwärtig sind.
Slicing lässt dich einen Ausschnitt aus einer Liste herausholen, ohne die Originalliste zu verändern:
buchstaben = ["a", "b", "c", "d", "e"]
print(buchstaben[1:4]) # ['b', 'c', 'd'] (Index 1 bis 3)
print(buchstaben[:3]) # ['a', 'b', 'c'] (Anfang bis Index 2)
print(buchstaben[2:]) # ['c', 'd', 'e'] (Index 2 bis Ende)
print(buchstaben[::2]) # ['a', 'c', 'e'] (jedes zweite Element)
print(buchstaben[::-1]) # ['e', 'd', 'c', 'b', 'a'] (umgekehrt) start = ab wo (inklusive), stop = bis wo (exklusive), step = Schrittweite. Lässt du einen Wert weg, verwendet Python den Standard: Anfang, Ende, 1.
List Comprehension ist eine kompakte Schreibweise, um aus einer bestehenden Liste eine neue zu erzeugen:
# Klassisch mit for-Schleife
quadrate = []
for i in range(1, 6):
quadrate.append(i ** 2)
# Mit List Comprehension (eine Zeile!)
quadrate = [i ** 2 for i in range(1, 6)]
print(quadrate) # [1, 4, 9, 16, 25] Mit Bedingung filtern
zahlen = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
gerade = [x for x in zahlen if x % 2 == 0]
print(gerade) # [2, 4, 6, 8, 10] Ein DictionaryEine Sammlung von Schlüssel-Wert-Paaren in geschweiften Klammern. Zugriff über den Schlüssel statt über einen Index. speichert Daten als Paare: Jeder Schlüssel hat einen Wert. Stell es dir wie ein Wörterbuch vor – du schlΓ€gst ein Wort (Schlüssel) nach und bekommst die Definition (Wert).
person = {
"name": "Anna",
"alter": 30,
"stadt": "Berlin"
}
print(person["name"]) # Anna
print(person["alter"]) # 30 Elemente hinzufügen und ändern
person["beruf"] = "Entwicklerin" # Neues Paar hinzufuegen
person["alter"] = 31 # Wert aendern
del person["stadt"] # Paar loeschen
print(person) # {'name': 'Anna', 'alter': 31, 'beruf': 'Entwicklerin'} Durch ein Dictionary iterieren
for schluessel, wert in person.items():
print(f"{schluessel}: {wert}") | Methode | Gibt zurück |
|---|---|
dict.keys() | Alle Schlüssel |
dict.values() | Alle Werte |
dict.items() | Alle Paare als Tupel |
dict.get("key", default) | Wert oder default, wenn Schlüssel fehlt |
Wenn du auf einen Schlüssel zugreifst, der nicht existiert (person["hobby"]), bekommst du einen KeyError. Nutze person.get("hobby", "unbekannt") – das gibt „unbekannt“ zurück statt abzustürzen.
Ein TupelWie eine Liste, aber unveränderlich (immutable). Einmal erstellt, können Elemente nicht hinzugefügt, entfernt oder geändert werden. sieht aus wie eine Liste, wird aber mit runden Klammern geschrieben und kann nicht verändert werden:
koordinate = (48.1, 11.6)
print(koordinate[0]) # 48.1
print(koordinate[1]) # 11.6
# Das geht NICHT:
# koordinate[0] = 50.0 # TypeError! Verwende Tupel für Daten, die sich nicht ändern sollen – z. B. Koordinaten, RGB-Farben (255, 0, 0) oder feste Konfigurationswerte. Listen verwendest du, wenn Elemente hinzugefügt oder entfernt werden.
Wenn du unsicher bist, ob du eine Liste, ein Dictionary oder ein Tupel brauchst, frage eine KI: „Ich möchte [Daten beschreiben] in Python speichern. Welche Datenstruktur passt am besten und warum?“
Slicing ist eine Möglichkeit, schnell Teile einer Liste zu extrahieren – z. B. die ersten 3 Elemente oder jedes zweite Element.
zahlen = [10, 20, 30, 40, 50, 60, 70]print(zahlen[:3]). Erwartet: [10, 20, 30]print(zahlen[-2:]). Erwartet: [60, 70]print(zahlen[::-1]). Erwartet: [70, 60, 50, 40, 30, 20, 10]Lösungshinweise anzeigen
Slicing erstellt immer eine neue Liste. Die Originalliste zahlen bleibt unverändert. [::-1] ist ein praktischer Trick, um eine Liste umzudrehen.
Dictionaries sind ideal für Daten, bei denen du einen Wert über einen Namen (Schlüssel) nachschlagen willst.
telefonbuch.py.telefonbuch = {"Anna": "0123", "Max": "0456", "Lisa": "0789"}name = input("Name suchen: ")get(): nummer = telefonbuch.get(name, "Nicht gefunden")Anna (gefunden) und Tom (nicht gefunden).Lösungshinweise anzeigen
get() ist sicherer als direkte Klammern: telefonbuch["Tom"] würde einen KeyError auslösen, telefonbuch.get("Tom", "Nicht gefunden") gibt den Standardwert zurück.
List Comprehension ist eine elegante Art, Listen zu filtern und zu transformieren – eine wichtige Python-Technik.
comprehension.py.zahlen = [3, 17, 42, 8, 99, 25, 11, 50]grosse = [x for x in zahlen if x > 20]grosse: [42, 99, 25, 50]Lösungshinweise anzeigen
Die List Comprehension liest sich fast wie Englisch: „Nimm x für jedes x in zahlen, wenn x größer als 20 ist.“ Die Originalliste bleibt unverändert.
Objektorientierung
Du lernst, wie du mit Klassen und Objekten eigene Datentypen erstellst – das Fundament für größere Programme.
Bisher hast du mit einfachen Datentypen (Zahlen, Strings, Listen) und Funktionen gearbeitet. Aber was, wenn du ein „Auto“ mit Farbe, Geschwindigkeit und Tank darstellen willst? Dafür brauchst du einen eigenen Datentyp – eine KlasseEin Bauplan für Objekte. Definiert, welche Eigenschaften (Attribute) und Fähigkeiten (Methoden) ein Objekt hat..
Stell dir eine Klasse wie einen Bauplan vor und ein Objekt wie das fertige Produkt: Aus dem Bauplan „Auto“ kannst du beliebig viele Autos bauen – jedes mit eigenen Werten für Farbe, Marke und Kilometerstand.
class Hund:
def __init__(self, name, rasse):
self.name = name
self.rasse = rasse
def bellen(self):
print(f"{self.name} sagt: Wuff!")
# Objekte erstellen
hund1 = Hund("Bello", "Labrador")
hund2 = Hund("Rex", "Schaeferhund")
print(hund1.name) # Bello
hund1.bellen() # Bello sagt: Wuff!
hund2.bellen() # Rex sagt: Wuff! self ist ein Verweis auf das aktuelle Objekt. Wenn du hund1.bellen() aufrufst, wird self automatisch zu hund1. So weiß die Methode, auf welches Objekt sie sich bezieht. self muss immer der erste Parameter jeder Methode sein.
__init__ ist eine spezielle Methode, die automatisch aufgerufen wird, wenn du ein neues Objekt erstellst. Hier setzt du die Startwerte (Attribute):
class Konto:
def __init__(self, inhaber, kontostand=0):
self.inhaber = inhaber
self.kontostand = kontostand
def einzahlen(self, betrag):
self.kontostand += betrag
print(f"{betrag} EUR eingezahlt. Neuer Stand: {self.kontostand} EUR")
def abheben(self, betrag):
if betrag > self.kontostand:
print("Nicht genug Guthaben!")
else:
self.kontostand -= betrag
print(f"{betrag} EUR abgehoben. Neuer Stand: {self.kontostand} EUR")
mein_konto = Konto("Anna", 100)
mein_konto.einzahlen(50) # 50 EUR eingezahlt. Neuer Stand: 150 EUR
mein_konto.abheben(200) # Nicht genug Guthaben! Mit Vererbung kannst du eine neue Klasse erstellen, die alle Eigenschaften und Methoden einer bestehenden Klasse übernimmt:
class Tier:
def __init__(self, name):
self.name = name
def sprechen(self):
print(f"{self.name} macht ein Geraeusch.")
class Katze(Tier): # Katze erbt von Tier
def sprechen(self): # Methode ueberschreiben
print(f"{self.name} sagt: Miau!")
class Hund(Tier):
def sprechen(self):
print(f"{self.name} sagt: Wuff!")
tiere = [Katze("Minka"), Hund("Bello")]
for tier in tiere:
tier.sprechen() Ausgabe:
Minka sagt: Miau!
Bello sagt: Wuff! Die Eltern-Klasse (Tier) definiert das allgemeine Verhalten. Die Kind-Klassen (Katze, Hund) spezialisieren es. Kind-Klassen können Methoden überschreiben (eigene Version schreiben) oder neue Methoden hinzufügen.
class Produkt:
def __init__(self, name, preis):
self.name = name
self.preis = preis
def __str__(self):
return f"{self.name}: {self.preis} EUR"
p = Produkt("Laptop", 999)
print(p) # Laptop: 999 EUR Wenn du ein eigenes Projekt planst, frage eine KI: „Ich möchte eine Python-Klasse für [Beschreibung] schreiben. Welche Attribute und Methoden würden Sinn machen? Ich bin Anfänger bei OOP.“
Klassen sind der nächste Schritt in der Programmierung. Hier erstellst du deinen ersten eigenen Datentyp.
auto.py.Auto mit __init__, das marke, farbe und km als Parameter nimmt.self.fahren(strecke) hinzu, die strecke zu self.km addiert und den neuen Kilometerstand ausgibt.mein_auto = Auto("VW", "blau", 50000)mein_auto.fahren(150) auf. Erwartet: Ausgabe mit dem neuen Kilometerstand 50150.Lösungshinweise anzeigen
In __init__ speicherst du: self.marke = marke usw. In fahren schreibst du: self.km += strecke. Vergiss self nicht als ersten Parameter bei jeder Methode!
Vererbung ermöglicht es, bestehende Klassen zu erweitern, statt alles neu zu schreiben.
auto.py Datei.ElektroAuto(Auto), die von Auto erbt.__init__ einen zusätzlichen Parameter batterie hinzu. Rufe super().__init__(marke, farbe, km) auf, um die Eltern-Attribute zu setzen.laden() hinzu, die "Batterie wird geladen..." ausgibt.fahren() (geerbt) als auch laden() (neu) auf.Lösungshinweise anzeigen
super().__init__(...) ruft den __init__ der Eltern-Klasse auf. So musst du marke, farbe und km nicht nochmal speichern. ElektroAuto kann fahren() nutzen, obwohl es nur in Auto definiert ist.
Module in Python
Du lernst, wie du Code in Module aufteilst, die Standardbibliothek nutzt und eigene Module erstellst.
Ein Modul ist einfach eine Python-Datei (.py), die Funktionen, Klassen oder Variablen enthält. Statt alles in eine riesige Datei zu quetschen, teilst du deinen Code in logische Einheiten auf. Außerdem kannst du auf tausende fertige Module zurückgreifen, die andere Programmierer geschrieben haben.
# Ganzes Modul importieren
import math
print(math.sqrt(16)) # 4.0
print(math.pi) # 3.141592653589793
# Einzelne Funktionen importieren
from math import sqrt, pi
print(sqrt(25)) # 5.0 (ohne math. davor)
# Modul mit Alias importieren
import math as m
print(m.sqrt(9)) # 3.0 import math ist am klarsten – du siehst immer, woher eine Funktion kommt. from math import sqrt spart Tipparbeit, wenn du nur wenige Funktionen brauchst. Vermeide from math import * – das importiert alles und kann zu Namenskonflikten führen.
Python wird mit einer riesigen Sammlung von Modulen geliefert – der Standardbibliothek. Hier die drei nützlichsten für den Anfang:
math – Mathematik
import math
print(math.sqrt(144)) # 12.0 (Quadratwurzel)
print(math.ceil(3.2)) # 4 (aufrunden)
print(math.floor(3.9)) # 3 (abrunden)
print(math.pow(2, 10)) # 1024.0 (Potenz) random – Zufallszahlen
import random
print(random.randint(1, 6)) # Zufallszahl 1-6 (Wuerfel)
print(random.choice(["A", "B", "C"])) # Zufaelliges Element
karten = ["Herz", "Karo", "Pik", "Kreuz"]
random.shuffle(karten) # Liste mischen
print(karten) os – Betriebssystem-Funktionen
import os
print(os.getcwd()) # Aktuelles Verzeichnis
print(os.listdir(".")) # Dateien im Verzeichnis
print(os.path.exists("test.py")) # Existiert die Datei? Jede Python-Datei ist automatisch ein Modul. Erstelle eine Datei und importiere sie aus einer anderen:
def begruessung(name):
return f"Hallo, {name}!"
def quadrat(zahl):
return zahl ** 2 import hilfsfunktionen
print(hilfsfunktionen.begruessung("Anna")) # Hallo, Anna!
print(hilfsfunktionen.quadrat(5)) # 25 Damit import hilfsfunktionen funktioniert, müssen beide Dateien im selben Ordner liegen. Später (Modul 15) lernst du, wie du mit Paketen und sys.path auch auf andere Ordner zugreifen kannst.
Python hat Module für fast alles. Frage eine KI: „Welche Python-Standardbibliothek-Module sind für Anfänger am nützlichsten? Zeige mir für jedes ein kurzes Beispiel.“
Das random-Modul ermöglicht Zufallszahlen – perfekt für Spiele und Simulationen.
wuerfel.py.import randomrandom.randint(1, 6).print(f"Wurf {i}: {ergebnis}")Lösungshinweise anzeigen
random.randint(1, 6) gibt eine zufällige ganze Zahl von 1 bis einschließlich 6 zurück. Anders als range() ist der Endwert hier inklusive!
Eigene Module erstellen ist der Schlüssel zu übersichtlichem Code in größeren Projekten.
rechner_modul.py mit zwei Funktionen: addiere(a, b) und multipliziere(a, b).return zurück.nutze_rechner.py im gleichen Ordner.import rechner_modulLösungshinweise anzeigen
Aufruf: rechner_modul.addiere(5, 3) ergibt 8. Wichtig: Nenne deine Datei nicht math.py oder random.py – das würde das gleichnamige Standard-Modul überschreiben!
Exceptions & Fehlerbehandlung
Du lernst, wie du Fehler in deinem Programm abfängst, statt es abstürzen zu lassen – mit try und except.
Programme stürzen ab, wenn etwas Unerwartetes passiert – der Benutzer gibt Text statt einer Zahl ein, eine Datei existiert nicht, oder eine Division durch Null wird versucht. Mit ExceptionEin Fehler, der während der Programmausführung auftritt. Kann mit try/except abgefangen werden, statt das Programm abstürzen zu lassen.-Behandlung kannst du solche Fälle abfangen und eine sinnvolle Reaktion programmieren.
try:
zahl = int(input("Gib eine Zahl ein: "))
print(f"Deine Zahl: {zahl}")
except ValueError:
print("Das war keine gueltige Zahl!") Wenn der Code im try-Block einen Fehler verursacht, springt Python zum passenden except-Block. Wenn kein Fehler auftritt, wird except übersprungen.
Gibt der Benutzer „abc“ ein, kann int("abc") das nicht umwandeln und wirft einen ValueError. Ohne try/except endet das Programm mit einer Fehlermeldung. Mit Fehlerbehandlung läuft es weiter.
| Exception | Wann? | Beispiel |
|---|---|---|
ValueError | Falscher Werttyp | int("abc") |
TypeError | Falscher Datentyp in Operation | "5" + 3 |
ZeroDivisionError | Division durch Null | 10 / 0 |
FileNotFoundError | Datei nicht gefunden | open("nix.txt") |
IndexError | Index außerhalb der Liste | [1,2][5] |
KeyError | Schlüssel nicht im Dictionary | {"a":1}["b"] |
try:
datei = open("daten.txt", "r")
inhalt = datei.read()
zahl = int(inhalt)
except FileNotFoundError:
print("Datei nicht gefunden!")
except ValueError:
print("Dateiinhalt ist keine Zahl!") Der finally-Block wird immer ausgeführt – egal ob ein Fehler auftrat oder nicht. Ideal für Aufräumarbeiten:
try:
datei = open("daten.txt", "r")
inhalt = datei.read()
except FileNotFoundError:
print("Datei nicht gefunden!")
finally:
print("Aufraeumarbeiten erledigt.") Mit raise kannst du bewusst einen Fehler auslösen – z. B. wenn eine Funktion ungültige Werte bekommt:
def set_alter(alter):
if alter < 0:
raise ValueError("Alter kann nicht negativ sein!")
return alter
try:
set_alter(-5)
except ValueError as e:
print(f"Fehler: {e}") # Fehler: Alter kann nicht negativ sein! class GuthabenError(Exception):
pass
def abheben(kontostand, betrag):
if betrag > kontostand:
raise GuthabenError(f"Zu wenig Guthaben! Verfuegbar: {kontostand} EUR")
return kontostand - betrag
try:
abheben(100, 200)
except GuthabenError as e:
print(e) # Zu wenig Guthaben! Verfuegbar: 100 EUR Fange nur die Fehler ab, die du erwartest und sinnvoll behandeln kannst. Schreibe nie except: ohne Fehlertyp – das fängt alles ab, auch Fehler, die du nicht erwartet hast, und macht die Fehlersuche schwieriger.
Wenn du eine Python-Fehlermeldung (Traceback) nicht verstehst, kopiere sie vollständig und frage eine KI: „Erkläre mir diesen Python-Traceback Schritt für Schritt. Was ist die Ursache und wie behebe ich den Fehler? [Traceback einfügen]“
In realen Programmen geben Benutzer oft ungültige Werte ein. Hier baust du eine robuste Eingabe.
sichere_eingabe.py.while True:.try-Block: Frage eine Zahl ab mit int(input("Zahl: ")) und brich mit break ab.except ValueError-Block: Gib "Bitte eine gueltige Zahl eingeben!" aus.abc, dann xyz, dann 42 ein. Die Schleife sollte erst bei 42 enden.Lösungshinweise anzeigen
Das Muster while True + try/except + break ist die Standard-Lösung für „frage den Benutzer so lange, bis die Eingabe gültig ist“. Der break steht im try-Block – so wird er nur bei erfolgreicher Umwandlung erreicht.
Dateien können fehlen oder unlesbar sein. Hier übst du, FileNotFoundError abzufangen.
datei_lesen.py.name = input("Dateiname: ")try-Block: Öffne die Datei und gib den Inhalt aus.except FileNotFoundError: Gib "Datei nicht gefunden!" aus.gibts_nicht.txt.Lösungshinweise anzeigen
Bei einer existierenden Datei wird der Inhalt angezeigt. Bei einer nicht existierenden Datei siehst du „Datei nicht gefunden!“ – das Programm stürzt nicht ab.
Datenstrukturen: Sets, Queue & Priority Queue
Du lernst drei weitere Datenstrukturen kennen, die dir bei speziellen Aufgaben helfen: Sets für eindeutige Werte, Queues für Warteschlangen und Priority Queues für priorisierte Verarbeitung.
Ein SetEine ungeordnete Sammlung von eindeutigen Elementen. Doppelte Werte werden automatisch entfernt. ist wie eine Schachtel, in die jeder Gegenstand nur einmal passt. Perfekt, wenn du Duplikate loswerden willst:
farben = {"rot", "blau", "rot", "gruen", "blau"}
print(farben) # {'rot', 'blau', 'gruen'} - Duplikate entfernt!
# Aus Liste ein Set machen (Duplikate entfernen)
namen = ["Anna", "Max", "Anna", "Lisa", "Max"]
einzigartig = set(namen)
print(einzigartig) # {'Anna', 'Max', 'Lisa'} Set-Operationen
a = {1, 2, 3, 4}
b = {3, 4, 5, 6}
print(a | b) # {1, 2, 3, 4, 5, 6} Vereinigung
print(a & b) # {3, 4} Schnittmenge
print(a - b) # {1, 2} Differenz | Operation | Symbol | Bedeutung |
|---|---|---|
| Vereinigung | a | b | Alle Elemente aus beiden |
| Schnittmenge | a & b | Nur gemeinsame Elemente |
| Differenz | a - b | Elemente nur in a |
| Element prüfen | x in a | Ist x enthalten? |
Ein frozenset ist ein Set, das nach der Erstellung nicht mehr verändert werden kann – ähnlich wie ein Tupel bei Listen. Erstelle es mit frozenset({1, 2, 3}).
Eine Queue (Warteschlange) funktioniert nach dem FIFO-Prinzip: First In, First Out – wer zuerst kommt, wird zuerst bedient. Genau wie eine Warteschlange an der Kasse.
from collections import deque
warteschlange = deque()
# Hinten anstellen
warteschlange.append("Anna")
warteschlange.append("Max")
warteschlange.append("Lisa")
# Vorne bedienen
naechster = warteschlange.popleft()
print(naechster) # Anna (war zuerst da)
print(warteschlange) # deque(['Max', 'Lisa']) Eine Priority Queue bedient nicht den Ältesten, sondern den mit der höchsten Priorität (= niedrigste Zahl) zuerst:
import heapq
aufgaben = []
heapq.heappush(aufgaben, (3, "Emails checken"))
heapq.heappush(aufgaben, (1, "Server-Fehler beheben"))
heapq.heappush(aufgaben, (2, "Meeting vorbereiten"))
# Wichtigste Aufgabe zuerst
wichtigste = heapq.heappop(aufgaben)
print(wichtigste) # (1, 'Server-Fehler beheben') Set: Wenn du Duplikate vermeiden oder Zugehörigkeit schnell prüfen willst. deque: Wenn du eine Warteschlange brauchst (zuerst rein, zuerst raus). heapq: Wenn du Elemente nach Priorität verarbeiten willst.
Frage eine KI: „Vergleiche mir in Python: Liste, Set, Dictionary, Tupel und deque. Wann nehme ich welche Struktur? Zeige eine Übersichtstabelle.“
Sets sind die schnellste Methode, um Duplikate zu entfernen – eine häufige Aufgabe in der Datenverarbeitung.
duplikate.py.namen = ["Anna", "Max", "Anna", "Lisa", "Max", "Tom", "Lisa"]einzigartig = set(namen)ergebnis = sorted(einzigartig)Lösungshinweise anzeigen
Die Originalliste hat 7 Einträge, das Set nur 4 (Anna, Max, Lisa, Tom). sorted() gibt eine neue, sortierte Liste zurück. Die Reihenfolge im Set selbst ist nicht garantiert.
Warteschlangen kommen in vielen Anwendungen vor – von Druckaufträgen bis zu Kundenverwaltungen.
warteschlange.py.from collections import dequeappend() hinzu.popleft() und gib ihren Namen aus.Lösungshinweise anzeigen
popleft() entfernt und gibt das erste Element zurück (FIFO). pop() würde das letzte Element entfernen (LIFO, wie ein Stapel). Für eine Warteschlange brauchst du popleft().
Funktionsparameter, Sortierung & Lambda
Du vertiefst dein Wissen über Funktionen: flexible Parameter mit *args und **kwargs, fortgeschrittenes Sortieren und kompakte Lambda-Funktionen.
Manchmal weißt du nicht im Voraus, wie viele Werte eine Funktion bekommt. Mit *args akzeptiert deine Funktion beliebig viele Argumente:
def summe(*args):
ergebnis = 0
for zahl in args:
ergebnis += zahl
return ergebnis
print(summe(1, 2, 3)) # 6
print(summe(10, 20, 30, 40)) # 100 Innerhalb der Funktion ist args ein ganz normales Tupel. Du kannst es mit einer for-Schleife durchgehen, len(args) aufrufen oder per Index zugreifen. Der Name args ist Konvention – der Stern * ist das Entscheidende.
def steckbrief(**kwargs):
for schluessel, wert in kwargs.items():
print(f"{schluessel}: {wert}")
steckbrief(name="Anna", alter=30, stadt="Berlin") Ausgabe:
name: Anna
alter: 30
stadt: Berlin kwargs ist innerhalb der Funktion ein ganz normales Dictionary. ** sammelt alle benannten Argumente, die keinem festen Parameter zugeordnet sind.
Du kennst bereits sort() und sorted(). Mit dem key-Parameter steuerst du, wonach sortiert wird:
woerter = ["Banane", "Apfel", "Kirsche", "Dattel"]
# Nach Laenge sortieren
nach_laenge = sorted(woerter, key=len)
print(nach_laenge) # ['Apfel', 'Banane', 'Dattel', 'Kirsche']
# Personen nach Alter sortieren
personen = [
{"name": "Max", "alter": 25},
{"name": "Anna", "alter": 30},
{"name": "Lisa", "alter": 22}
]
nach_alter = sorted(personen, key=lambda p: p["alter"])
for p in nach_alter:
print(f"{p['name']}: {p['alter']}") Eine Lambda-Funktion ist eine kleine, anonyme Funktion in einer Zeile. Sie eignet sich für einfache Berechnungen, die du nur einmal brauchst:
# Normale Funktion
def verdopple(x):
return x * 2
# Gleiche Funktion als Lambda
verdopple = lambda x: x * 2
print(verdopple(5)) # 10 map() wendet eine Funktion auf jedes Element an. filter() filtert Elemente nach einer Bedingung:
zahlen = [1, 2, 3, 4, 5]
# Jede Zahl verdoppeln
verdoppelt = list(map(lambda x: x * 2, zahlen))
print(verdoppelt) # [2, 4, 6, 8, 10]
# Nur gerade Zahlen behalten
gerade = list(filter(lambda x: x % 2 == 0, zahlen))
print(gerade) # [2, 4] In Python bevorzugen die meisten Entwickler List Comprehension: [x * 2 for x in zahlen] statt list(map(lambda x: x * 2, zahlen)). Beide Varianten tun das Gleiche – List Comprehension ist aber lesbarer.
Wenn du einen map/filter/lambda-Ausdruck nicht verstehst, frage eine KI: „Schreibe diesen Python-Ausdruck als List Comprehension um und erkläre den Unterschied: [Code einfügen]“
*args ermöglicht dir, Funktionen zu schreiben, die mit beliebig vielen Werten umgehen können.
flex_summe.py.durchschnitt(*args), die den Durchschnitt aller übergebenen Zahlen berechnet.len(args). Gib das Ergebnis mit return zurück.print(durchschnitt(10, 20, 30)). Erwartet: 20.0print(durchschnitt(5, 5)). Erwartet: 5.0Lösungshinweise anzeigen
Die Berechnung: return sum(args) / len(args). sum() ist eine eingebaute Python-Funktion, die alle Elemente einer Sammlung addiert. Achtung: Bei durchschnitt() ohne Argumente würde len(args) gleich 0 sein – Division durch Null!
Mit sorted() und key kannst du Listen nach beliebigen Kriterien sortieren – eine wichtige Fähigkeit für die Datenverarbeitung.
sortierung.py.sorted(personen, key=lambda p: p["alter"])sorted(personen, key=lambda p: p["name"])Lösungshinweise anzeigen
Die Lambda-Funktion lambda p: p["alter"] sagt sorted: „Verwende den Wert von alter als Sortierschlüssel.“ Ohne key wüsste Python nicht, wie es Dictionaries vergleichen soll.
Datum, String-Formatierung & defaultdict
Du lernst, wie du mit Datum und Uhrzeit arbeitest, Strings professionell formatierst und das praktische defaultdict nutzt.
Python hat ein eingebautes Modul für Datum und Uhrzeit. Damit kannst du das aktuelle Datum abrufen, Zeiträume berechnen und Datumsangaben formatieren:
from datetime import datetime, date, timedelta
# Aktuelles Datum und Uhrzeit
jetzt = datetime.now()
print(jetzt) # 2026-03-15 14:30:22.123456
# Nur das Datum
heute = date.today()
print(heute) # 2026-03-15
# Einzelne Teile abrufen
print(heute.year) # 2026
print(heute.month) # 3
print(heute.day) # 15 Datum formatieren mit strftime()
jetzt = datetime.now()
print(jetzt.strftime("%d.%m.%Y")) # 15.03.2026
print(jetzt.strftime("%H:%M Uhr")) # 14:30 Uhr
print(jetzt.strftime("%A, %d. %B %Y")) # Sunday, 15. March 2026 | Code | Bedeutung | Beispiel |
|---|---|---|
%d | Tag (zweistellig) | 15 |
%m | Monat (zweistellig) | 03 |
%Y | Jahr (vierstellig) | 2026 |
%H | Stunde (24h) | 14 |
%M | Minute | 30 |
%A | Wochentag (englisch) | Sunday |
Mit Zeiträumen rechnen (timedelta)
from datetime import date, timedelta
heute = date.today()
in_einer_woche = heute + timedelta(days=7)
print(f"In einer Woche: {in_einer_woche}")
geburtstag = date(2026, 12, 24)
tage_bis = (geburtstag - heute).days
print(f"Noch {tage_bis} Tage bis Weihnachten!") Du kennst bereits f-Strings aus Modul 02. Hier lernst du erweiterte Formatierungsoptionen:
preis = 49.9
name = "Python-Buch"
# Zwei Nachkommastellen
print(f"Preis: {preis:.2f} EUR") # Preis: 49.90 EUR
# Rechtsbuendig in 20 Zeichen
print(f"{name:>20}") # Python-Buch
# Tausender-Trennzeichen
gross = 1234567
print(f"{gross:,}") # 1,234,567
# Prozentwert
anteil = 0.75
print(f"{anteil:.0%}") # 75% | Format-Code | Bedeutung | Beispiel |
|---|---|---|
:.2f | 2 Nachkommastellen | 49.90 |
:>20 | Rechtsbündig, 20 Zeichen breit | Abstand links |
:, | Tausender-Trennzeichen | 1,234,567 |
:.0% | Prozentwert (ohne Nachkomma) | 75% |
Statt f-Strings kannst du auch "Preis: {:.2f}".format(49.9) verwenden. F-Strings sind aber kürzer und lesbarer – bevorzuge sie.
Ein defaultdict erstellt automatisch einen Standardwert, wenn du auf einen noch nicht vorhandenen Schlüssel zugreifst:
from collections import defaultdict
# Woerter zaehlen
text = "der hund mag den hund und der hund mag knochen"
zaehler = defaultdict(int) # Standard: 0
for wort in text.split():
zaehler[wort] += 1
print(dict(zaehler))
# {'der': 2, 'hund': 3, 'mag': 2, 'den': 1, 'und': 1, 'knochen': 1} Mit einem normalen Dictionary müsstest du erst prüfen, ob der Schlüssel existiert: if wort not in zaehler: zaehler[wort] = 0. defaultdict(int) erledigt das automatisch.
Die vielen %-Codes von strftime() sind schwer zu merken. Frage eine KI: „Wie formatiere ich in Python ein Datum als 'Montag, 15. März 2026, 14:30 Uhr'? Zeige mir den strftime-Code.“
Datumsberechnungen kommen oft vor – z. B. Countdown bis zu einem Event oder Berechnung von Fristen.
countdown.py.from datetime import dateheute = date.today()ziel = date(2026, 12, 31)tage = (ziel - heute).daysprint(f"Noch {tage} Tage bis Silvester!")Lösungshinweise anzeigen
Die Subtraktion zweier date-Objekte ergibt ein timedelta-Objekt. Mit .days bekommst du die Differenz in Tagen. Das Ergebnis hängt vom heutigen Datum ab.
Wörter zählen ist eine klassische Aufgabe in der Textanalyse – und mit defaultdict besonders elegant.
wort_zaehler.py.from collections import defaultdictdefaultdict(int).for wort, anzahl in sorted(zaehler.items()):Lösungshinweise anzeigen
Tipp: Wandle alle Wörter mit .lower() in Kleinbuchstaben um, damit „Der“ und „der“ als dasselbe Wort gezählt werden. sorted(zaehler.items()) sortiert alphabetisch nach Schlüssel.
Entwicklung mit PyCharm & Kommandozeile
Du lernst PyCharm als professionelle IDE kennen, arbeitest mit der Kommandozeile und verwaltest Pakete mit pip und virtuellen Umgebungen.
IDLE ist perfekt für den Einstieg, aber für größere Projekte brauchst du mehr: automatische Vervollständigung, Fehlererkennung während des Tippens, Debugging-Werkzeuge und Projektverwaltung. PyCharm Community Edition ist kostenlos und bietet all das.
https://www.jetbrains.com/pycharm/download/ herunter.Strg+Shift+F10 = Skript ausführen, Strg+Leertaste = Autovervollständigung, Strg+D = Zeile duplizieren, Strg+/ = Zeile auskommentieren.
Die Kommandozeile (auch Terminal oder CMD) ist ein mächtiges Werkzeug. Du kannst Python-Skripte direkt ausführen, Pakete installieren und vieles mehr:
# Windows: Win+R, dann "cmd" eingeben
# Oder in PyCharm: View → Tool Windows → Terminal python mein_skript.py python --version
# Python 3.12.x Auf manchen Systemen heißt der Befehl python3 statt python. Wenn python --version nicht funktioniert oder Python 2 anzeigt, versuche python3 --version.
pip ist der Paketmanager von Python. Damit installierst du zusätzliche Bibliotheken, die andere Entwickler erstellt haben:
# Paket installieren
pip install requests
# Paket mit bestimmter Version
pip install requests==2.31.0
# Alle installierten Pakete anzeigen
pip list
# Paket deinstallieren
pip uninstall requests Verschiedene Projekte brauchen oft verschiedene Versionen der gleichen Bibliothek. Mit einer virtuellen Umgebung bekommt jedes Projekt seine eigenen Pakete, ohne andere Projekte zu beeinflussen:
# Virtuelle Umgebung erstellen
python -m venv meine_umgebung
# Aktivieren (Windows)
meine_umgebung\Scripts\activate
# Aktivieren (Mac/Linux)
source meine_umgebung/bin/activate
# Jetzt pip verwenden - Pakete landen in der Umgebung
pip install requests
# Deaktivieren
deactivate Wenn du in PyCharm ein neues Projekt erstellst, bietet es dir an, automatisch eine virtuelle Umgebung einzurichten. Das ist die empfohlene Vorgehensweise.
# Aktuelle Pakete in Datei speichern
pip freeze > requirements.txt
# Pakete aus Datei installieren (z.B. auf neuem Rechner)
pip install -r requirements.txt Wenn pip install einen Fehler wirft, kopiere die Fehlermeldung und frage eine KI: „Ich bekomme diesen Fehler bei pip install auf Windows: [Fehlermeldung]. Was kann ich tun?“
PyCharm ist die IDE, die professionelle Python-Entwickler nutzen. Hier richtest du dein erstes Projekt ein.
python_uebungen und aktiviere New virtual environment.halloprint("Hallo aus PyCharm!") und führe es mit Strg+Shift+F10 aus.Hallo aus PyCharm! sehen.Lösungshinweise anzeigen
Falls die Ausgabe nicht erscheint: Prüfe, ob unten rechts in PyCharm der richtige Python-Interpreter angezeigt wird (z. B. Python 3.12). Klicke darauf, um ihn zu wechseln.
Pakete erweitern Python um neue Fähigkeiten. Hier installierst du dein erstes externes Paket.
colorama: pip install coloramafarben.py.from colorama import Fore; print(Fore.GREEN + "Gruen!" + Fore.RESET)Lösungshinweise anzeigen
colorama ermöglicht farbige Textausgabe im Terminal. Fore.GREEN färbt den nachfolgenden Text grün, Fore.RESET setzt die Farbe zurück. Weitere Farben: RED, YELLOW, BLUE.
Jupyter Notebooks
Du lernst Jupyter Notebooks kennen – ein interaktives Werkzeug, in dem du Code, Text und Visualisierungen in einem Dokument kombinieren kannst.
Ein Jupyter Notebook ist ein interaktives Dokument, das Code-Zellen und Text-Zellen mischt. Du schreibst Python-Code in eine Zelle, führst sie aus und siehst das Ergebnis direkt darunter. Dazwischen kannst du Erklärungen, Überschriften und Bilder einfügen. Perfekt für Datenanalyse, Experimente und Dokumentation.
# Jupyter installieren
pip install notebook
# Jupyter starten
jupyter notebook Nach dem Start öffnet sich dein Browser mit der Jupyter-Oberfläche. Von dort aus kannst du neue Notebooks erstellen.
pip install notebook ein und warte auf die Installation.jupyter notebook ein. Dein Browser öffnet sich automatisch.Schließe das Terminal nicht, solange du Jupyter nutzt – dort läuft der Jupyter-Server. Beende Jupyter mit Strg+C im Terminal.
Ein Notebook besteht aus Zellen. Jede Zelle hat einen Typ:
| Zelltyp | Inhalt | Tastenkombination |
|---|---|---|
| Code | Python-Code, wird ausgeführt | Y (im Command Mode) |
| Markdown | Text, Überschriften, Listen | M (im Command Mode) |
Wichtige Shortcuts
| Aktion | Shortcut |
|---|---|
| Zelle ausführen | Shift+Enter |
| Neue Zelle darunter | B (im Command Mode) |
| Neue Zelle darüber | A (im Command Mode) |
| Zelle löschen | D D (zweimal D) |
| In Command Mode wechseln | Esc |
| In Edit Mode wechseln | Enter |
Im Edit Mode (grüner Rand) tippst du in eine Zelle. Im Command Mode (blauer Rand) verwendest du Shortcuts, um Zellen zu verwalten. Wechsle mit Esc und Enter.
Markdown-Zellen nutzt du für Erklärungen und Überschriften. Die wichtigsten Formatierungen:
# Ueberschrift 1
## Ueberschrift 2
### Ueberschrift 3
**Fett** und *Kursiv*
- Aufzaehlungspunkt 1
- Aufzaehlungspunkt 2
`Code inline`
```python
# Code-Block
print("Hallo")
``` Der Kernel ist der Python-Prozess, der deinen Code ausführt. Wichtige Aktionen:
| Aktion | Wann? | Wo? |
|---|---|---|
| Kernel neu starten | Wenn etwas hängt oder Variablen zurücksetzen | Kernel → Restart |
| Alle Zellen ausführen | Notebook von Anfang bis Ende durchlaufen | Cell → Run All |
| Kernel unterbrechen | Endlosschleife stoppen | Kernel → Interrupt |
Variablen existieren erst, wenn die Zelle ausgeführt wurde. Wenn du Zelle 3 vor Zelle 2 ausführst und Zelle 3 eine Variable aus Zelle 2 braucht, bekommst du einen NameError. Im Zweifel: Kernel → Restart & Run All.
Jupyter ist ideal zum Experimentieren. Frage eine KI: „Erstelle mir ein Jupyter Notebook als Vorlage zum Thema [dein Thema]. Mit Erklärungen in Markdown und Code-Beispielen zum Ausführen.“
Jupyter Notebooks sind die Standardumgebung für Datenanalyse und interaktives Arbeiten mit Python.
jupyter notebook.Esc, dann M) und schreibe # Mein erstes Notebook. Führe aus mit Shift+Enter.print("Hallo aus Jupyter!") und führe aus.ergebnis = 2 ** 10 und ergebnis (ohne print – Jupyter zeigt den letzten Wert automatisch an).1024 unter der Zelle sehen. Speichere das Notebook mit Strg+S.Lösungshinweise anzeigen
In Jupyter wird die letzte Zeile einer Code-Zelle automatisch angezeigt, wenn sie einen Wert hat (kein print() nötig). Die [1]:-Nummern links zeigen, in welcher Reihenfolge die Zellen ausgeführt wurden.
Die Stärke von Jupyter ist die Mischung aus Erklärungen und ausführbarem Code – wie ein interaktives Lehrbuch.
Lösungshinweise anzeigen
Markdown wird nach dem Ausführen formatiert angezeigt (keine Sterne mehr). Ein gutes Notebook wechselt zwischen Erklärungen (Markdown) und Code, sodass jemand anderes es wie einen Bericht lesen kann.
BONUS: Web Scraping mit Python
Du lernst, wie du mit Python automatisch Daten von Webseiten extrahierst – mit requests und BeautifulSoup.
Web Scraping bedeutet, Daten automatisch von Webseiten zu extrahieren. Statt mühsam Informationen von Hand zu kopieren, schreibst du ein Python-Skript, das die Arbeit für dich erledigt. Typische Anwendungen: Preisvergleiche, Nachrichtensammlung, Datenanalyse.
Nicht jede Webseite erlaubt Scraping. Prüfe immer die robots.txt der Seite (z. B. https://example.com/robots.txt) und die Nutzungsbedingungen. Scrape keine persönlichen Daten und überlaste keine Server mit zu vielen Anfragen.
pip install requests beautifulsoup4 | Bibliothek | Aufgabe |
|---|---|
requests | Webseiten herunterladen (HTTP-Anfragen) |
beautifulsoup4 | HTML-Code durchsuchen und Daten extrahieren |
import requests
antwort = requests.get("https://example.com")
print(antwort.status_code) # 200 = OK
print(antwort.text[:200]) # Ersten 200 Zeichen des HTML-Codes 200 = Erfolg, 404 = Seite nicht gefunden, 403 = Zugriff verweigert, 500 = Serverfehler. Prüfe immer den Statuscode, bevor du den Inhalt verarbeitest.
from bs4 import BeautifulSoup
import requests
antwort = requests.get("https://example.com")
suppe = BeautifulSoup(antwort.text, "html.parser")
# Seitentitel finden
print(suppe.title.text) # Example Domain
# Alle Links finden
for link in suppe.find_all("a"):
print(link.get("href")) Wichtige BeautifulSoup-Methoden
| Methode | Was sie tut | Beispiel |
|---|---|---|
find("tag") | Erstes Element finden | suppe.find("h1") |
find_all("tag") | Alle Elemente finden | suppe.find_all("p") |
find(class_="name") | Element mit CSS-Klasse | suppe.find(class_="titel") |
find(id="name") | Element mit ID | suppe.find(id="content") |
.text | Nur den Text (ohne HTML) | element.text |
.get("attr") | Attribut-Wert lesen | link.get("href") |
Dieses Skript lädt eine Webseite herunter und extrahiert alle Überschriften:
import requests
from bs4 import BeautifulSoup
url = "https://example.com"
antwort = requests.get(url)
if antwort.status_code == 200:
suppe = BeautifulSoup(antwort.text, "html.parser")
# Alle h1 und h2 Ueberschriften finden
ueberschriften = suppe.find_all(["h1", "h2"])
for h in ueberschriften:
print(f"{h.name}: {h.text.strip()}")
else:
print(f"Fehler: Status {antwort.status_code}") Beim Scraping immer in kleinen Schritten arbeiten: Erst die Seite herunterladen und den HTML-Code anschauen, dann gezielt die richtigen Tags finden. Browser-DevTools (F12) helfen dir, die Struktur der Seite zu verstehen.
Wenn du nicht weißt, welchen HTML-Tag oder welche Klasse du suchen musst, frage eine KI: „Ich möchte von dieser Webseite [URL] die Produktpreise extrahieren. Welche BeautifulSoup-Selektoren brauche ich?“
Der erste Schritt beim Web Scraping ist immer, die Seite herunterzuladen und den Inhalt zu verstehen.
scraper.py.import requests und from bs4 import BeautifulSoupantwort = requests.get("https://example.com")print(antwort.status_code). Erwartet: 200suppe = BeautifulSoup(antwort.text, "html.parser")print(suppe.title.text). Erwartet: Example DomainFür diese Aufgabe brauchst du eine aktive Internetverbindung. Wenn requests.get() fehlschlägt, prüfe deine Verbindung oder versuche es mit try/except requests.ConnectionError.
Lösungshinweise anzeigen
example.com ist eine offizielle Test-Website, die immer verfügbar ist. Der Titel ist „Example Domain“. Wenn du antwort.text ausgibst, siehst du den rohen HTML-Code der Seite.
Links extrahieren ist eine typische Scraping-Aufgabe – z. B. um alle Unterseiten einer Website zu finden.
scraper.py Datei.links = suppe.find_all("a")print(link.text, "-", link.get("href"))https://news.ycombinator.com – erlaubt Scraping).Lösungshinweise anzeigen
find_all("a") findet alle Anker-Elemente (Links) im HTML. link.get("href") gibt die URL zurück, link.text den anklickbaren Text. Manche Links haben kein href – dann gibt get("href") den Wert None zurück.
Frage eine KI: „Ich möchte mit Python die aktuellen Nachrichten-Überschriften von [Website] scrapen. Ist das erlaubt? Zeige mir den Code Schritt für Schritt.“