Lesbar, vielseitig, ideal zum Einstieg
Ausführen: Datei als hallo.py speichern und im Terminal mit python hallo.py (unter Linux/macOS oft python3 hallo.py) starten, oder einzelne Zeilen im interaktiven Modus python ausprobieren.
import this.pypython datei.py führt eine Datei aus, python allein startet die interaktive Konsolepython3python --version
Python 3.12.4print() gibt Werte aus; mit sep und end steuerst du die Trennzeichen# startet einen KommentarIndentationError\n ist ein Zeilenumbruch, \t ein Tabulatorprint("Hallo, Welt!")
print("Python macht Spaß")
print(2 + 3)name = wert legt eine Variable an oder ändert sie_; nicht mit Ziffer beginnen; Groß/Klein zählta, b = b, a tauscht zwei Werte+=, -=, *=, /=name = "Mia"
alter = 17
groesse = 1.68
print(name, alter, groesse)type(x) zeigt den Typ, isinstance(x, int) prüft ihnint(), float(), str(), bool(), list()False, None, 0, leerer Text und leere Sammlungenint(7.9) ergibt 7 (abschneiden), nicht 8print(type(42))
print(type(3.14))
print(type("Hallo"))
print(type(True))
print(type([1, 2, 3]))
print(type((1, 2)))
print(type({"a": 1}))
print(type({1, 2}))
print(type(None))/ ergibt immer einen float, // rundet ab, % liefert den Rest, ** potenziertint ist beliebig groß, float ist leicht ungenau (0.1 + 0.2)decimal.Decimalround(), abs(), min(), max(), sum() sind eingebautmath bringt sqrt, pi, floor, ceil und mehr; random liefert Zufallprint(2 ** 10)
print(2 ** 100)
print(1_000_000 + 1) # Unterstriche machen große Zahlen lesbar
print(0xFF, 0b1010, 0o17) # hexadezimal, binär, oktalTrue oder False; == vergleicht, = weist zuand, or, not verknüpfen Bedingungen und werten kurz ausin prüft Enthaltensein, is prüft Objektidentität (is None für None)+= sparen Schreibarbeitalter = 17
print(alter >= 18)
print(alter != 18)
print(10 < alter < 20) # verkettet: Python erlaubt das wie in der Mathematikinput() liefert immer Text; mit int() oder float() umwandelnprint(..., sep=..., end=...) steuert Trennzeichen und Zeilenendef"{ausdruck:format}":.2f, :,, :>8, :05d, :.1%.format() und % sind ältere Alternativenname = input("Wie heißt du? ")
print("Hallo,", name)
Wie heißt du? Mia
Hallo, Mialen() liefert die Längetext[von:bis:schritt], das Ende ist ausgeschlossen+ verkettet, * wiederholt, in prüft Enthaltensein\n, \t, \\; Raw-String r"..." für Pfadea = "Hallo"
b = 'Welt'
c = "Er sagte: 'Hi'" # einfache Anführungszeichen im Text
d = 'Sie sagte: "Hallo"'
print(a, b)
print(c)
print(d)upper, lower, title, strip, split, join, replace, find, count"-".join(liste) ist das Gegenstück zu text.split("-")isdigit, isalpha, startswith, endswiths = "Hallo Welt"
print(s.upper())
print(s.lower())
print(s.title())
print(s.capitalize())
print(s.swapcase())if bedingung: mit eingerücktem Block; elif für weitere Fälle; else für den Restand, or, notwert_a if bedingung else wert_bmatch/case (ab Python 3.10) für viele Einzelfälletemperatur = 28
if temperatur > 25:
print("Es ist heiß!")
print("Das steht immer da.")while bedingung: wiederholt, solange die Bedingung wahr istbreak beendet die Schleife, continue springt zum nächsten Durchlaufelse läuft nur, wenn nicht per break abgebrochen wurdewhile True + break für Eingabe-Schleifenzaehler = 1
while zaehler <= 5:
print("Durchlauf", zaehler)
zaehler += 1
print("Fertig")for element in sammlung: durchläuft jedes Elementrange(start, ende, schritt): das Ende ist ausgeschlossenenumerate() liefert Index und Element, zip() führt Listen parallelbreak, continue und else funktionieren wie bei whilefarben = ["rot", "grün", "blau"]
for farbe in farben:
print(farbe)[a, b, c], geordnet, veränderlich, beliebige Typen[von:bis]append, insert, remove, pop, del ändern die Liste+ verbindet, * wiederholt, in prüft, len, sum, min, maxb = a kopiert nicht: für eine Kopie a.copy() oder a[:]einkauf = ["Brot", "Milch", "Eier"]
zahlen = [3, 1, 4, 1, 5]
gemischt = ["Text", 42, 3.14, True]
leer = []
print(einkauf)
print(len(einkauf))
print(type(gemischt))append, extend, insert, remove, pop, clear verändern die Liste direktsort() verändert und liefert None; sorted() liefert eine neue Listekey= bestimmt das Sortierkriterium, reverse=True kehrt uma, b, *rest = listeany() und all() prüfen Bedingungen über eine ganze Listel = [5, 2, 9, 2]
l.extend([7, 1])
print(l)
print(l.count(2), l.index(9))
l.reverse()
print(l)
l.clear()
print(l)[ausdruck for x in sammlung if bedingung]if am Ende filtert; wert1 if bed else wert2 vor dem for wählt Werte{k: v for ...} und Mengen {x for ...} gibt esquadrate = [x * x for x in range(1, 6)]
print(quadrate)
# Dasselbe mit einer Schleife:
quadrate2 = []
for x in range(1, 6):
quadrate2.append(x * x)
print(quadrate2 == quadrate)(a, b, c), geordnet und unveränderlich(42,)x, y = punktpunkt = (3, 4)
farbe = ("rot", "grün", "blau")
einzeln = (42,) # ein Element braucht ein Komma!
leer = ()
print(punkt, type(punkt))
print(type((42)), type(einzeln)){a, b, c}, keine Doppelten, keine feste Reihenfolge; leere Menge: set()add, discard, remove; Mengen sind veränderlich| Vereinigung, & Schnitt, - Differenz, ^ symmetrische Differenzx in menge ist sehr schnellfarben = {"rot", "grün", "blau", "rot"} # "rot" nur einmal
print(len(farben))
print("rot" in farben)
leer = set() # {} wäre ein leeres Dictionary!
print(type(leer), type({})){schluessel: wert}; Zugriff mit d[schluessel], sicher mit d.get(schluessel, standard).keys(), .values(), .items() zum Durchlaufen; update, pop, del zum Änderna | b führt zwei Dictionaries zusammen (ab 3.9)person = {"name": "Mia", "alter": 17, "stadt": "Köln"}
print(person)
print(person["name"])
print(len(person))
print(type(person))b = a kopiert nur den Verweis.copy() oder [:]; tiefe Kopie: copy.deepcopy()[[0] * 3] * 3 erzeugt dieselbe innere Liste dreimal[] oder {} als Standardwert eines Parameters verwenden; None nehmen== vergleicht Werte, is vergleicht Objektea = [1, 2, 3]
b = a
b.append(4)
print(a)
print(a is b)
print(id(a) == id(b))def name(parameter): definiert, name(argument) ruft aufreturn gibt einen Wert zurück und beendet die Funktion; ohne return kommt Nonedef begruessung():
print("Hallo!")
print("Schön, dass du da bist.")
begruessung()
begruessung()def f(a, b=10), Parameter mit Standardwert nach hintenf(b=2, a=1)*args sammelt zusätzliche Positionsargumente (Tupel), **kwargs benannte (Dictionary)*liste und **dict* in der Definition erzwingt benannte Argumentedef begruesse(name, gruss="Hallo"):
return f"{gruss}, {name}!"
print(begruesse("Mia"))
print(begruesse("Tom", "Guten Morgen"))globalnonlocal ändert Variablen einer umgebenden Funktiontitel = "Mathe" # global
def zeige():
punkte = 42 # lokal
print(titel, punkte)
zeige()
print(titel)
print(punkte)lambda x: ausdruck ist eine kleine namenlose Funktionkey= bei sorted, min, max nimmt eine Funktionmap wendet an, filter wählt aus, reduce fasst zusammenmap/filterdef verdopple(x):
return x * 2
f = verdopple # ohne Klammern: die Funktion selbst, kein Aufruf
print(f(21))
def wende_an(funktion, wert):
return funktion(wert)
print(wende_an(verdopple, 5))
print(wende_an(str.upper, "hallo"))RecursionErrorfunctools.cachedef fakultaet(n):
if n <= 1: # Basisfall
return 1
return n * fakultaet(n - 1) # rekursiver Fall
print(fakultaet(5))
print(fakultaet(10))next() Element für Element; StopIteration bedeutet "fertig"yield macht aus einer Funktion einen Generator, der zwischen den Werten pausiert(ausdruck for x in folge)itertools bringt viele fertige Bausteineit = iter(["a", "b", "c"])
print(next(it))
print(next(it))
print(next(it))
print(next(it, "Ende")) # mit Standardwert statt Fehler@dekorator über def ist dasselbe wie f = dekorator(f)*args, **kwargs reichen beliebige Argumente durch@functools.wraps erhält Name und Docstringdef laut(funktion):
def verpackt(*args, **kwargs):
ergebnis = funktion(*args, **kwargs)
return ergebnis.upper() + "!"
return verpackt
@laut
def gruss(name):
return f"hallo {name}"
print(gruss("mia"))with open(name, modus, encoding="utf-8") as f: schließt die Datei automatischr lesen, w schreiben (überschreibt), a anhängen, b für Binärdatenf.read(), for zeile in f, f.readlines(), f.write(text)FileNotFoundError, wenn eine Datei zum Lesen fehltpathlib.Path für bequeme, plattformunabhängige Pfadewith open("notizen.txt", "w", encoding="utf-8") as datei:
datei.write("Erste Zeile\n")
datei.write("Zweite Zeile mit Umlauten: äöü\n")
print("geschrieben")try: enthält riskanten Code, except Art: behandelt den Fehlerelse läuft ohne Fehler, finally immerexcept:raise Art("Text") löst selbst eine Ausnahme ausExceptionexcept ... as e gibt Zugriff auf die Fehlermeldungtry:
zahl = int("abc")
print("Zahl:", zahl)
except ValueError:
print("Das war keine gültige Zahl.")
print("Das Programm läuft weiter.").py-Datei; import modul macht sie verfügbarfrom modul import name und import modul as kurzname sind Variantenif __name__ == "__main__": trennt Startcode von importierbarem Code__init__.py)ModuleNotFoundErrorimport math
print(math.sqrt(81))
print(math.pi)pip install name holt Pakete von PyPI; python -m pip ist die sichere Schreibweisepython -m venv .venv, aktivieren mit activatepip freeze > requirements.txt und pip install -r requirements.txt teilen Abhängigkeitenpip install requests # Paket installieren
pip install requests==2.32.3 # genau diese Version
pip install --upgrade requests
pip uninstall requests
pip list # installierte Pakete anzeigen
pip show requests # Details zu einem Paketcollections hat Counter, defaultdict, deque und namedtuplestatistics für Mittelwert, Median, Standardabweichungsqlite3 bringt eine eingebaute SQL-Datenbankfrom collections import Counter, defaultdict, deque, namedtuple
# Counter zählt
print(Counter("mississippi"))
print(Counter("a b a c a b".split()).most_common(2))
# defaultdict legt fehlende Schlüssel selbst an
gruppen = defaultdict(list)
for wort in ["Apfel", "Ananas", "Birne", "Banane", "Kirsche"]:
gruppen[wort[0]].append(wort)
print(dict(gruppen))
# deque: schnelle Warteschlange
q = deque([1, 2, 3])
q.append(4)
q.appendleft(0)
print(q.popleft(), list(q))
# namedtuple: Tupel mit Feldnamen
Punkt = namedtuple("Punkt", ["x", "y"])
p = Punkt(3, 4)
print(p.x, p.y, p)json.dumps / json.loads für Text, json.dump / json.load für Dateiendict, Arrays zu list, null zu Nonecsv.writer, csv.reader, csv.DictReader für Tabellennewline="" und encoding="utf-8" öffnenimport json
daten = {"name": "Mia", "alter": 17, "hobbys": ["Lesen", "Rad"], "aktiv": True, "partner": None}
text = json.dumps(daten)
print(text)
print(json.dumps(daten, indent=2, ensure_ascii=False)[:60])date, time, datetime und timedelta stammen aus datetimestrftime formatiert, strptime liest; isoformat() liefert das ISO-Formattimedelta-Objekte (.days, .total_seconds())calendar kennt Schaltjahre und Monatslängenzoneinfo.ZoneInfo für Zeitzonen; intern UTC speichernfrom datetime import date, datetime
d = date(2025, 12, 24)
print(d)
print(d.year, d.month, d.day)
print(d.weekday()) # Montag = 0 ... Sonntag = 6
moment = datetime(2025, 3, 8, 14, 30, 15)
print(moment)
print(moment.hour, moment.minute)
print(date.today() >= date(2020, 1, 1))r"..." schreibensearch, match, fullmatch, findall, sub, split\d, \w, \s, ., [...], Quantoren * + ? {n}m.group(1), (?P<name>...))? nach einem Quantor macht ihn sparsam; Flags wie re.IGNORECASEimport re
text = "Meine Nummer ist 12345, deine 67890."
print(re.search(r"\d+", text)) # erster Treffer
print(re.findall(r"\d+", text)) # alle Treffer als Liste
print(re.sub(r"\d", "#", text)) # ersetzen__init__ setzt die Anfangswerte, self ist das aktuelle Objekt__str__ für Menschen, __repr__ für Entwickler@classmethod und @staticmethod für Methoden ohne Instanz_name bedeutet "intern" (nur Konvention)class Hund:
def __init__(self, name, alter):
self.name = name
self.alter = alter
def bellen(self):
return f"{self.name} sagt: Wuff!"
rex = Hund("Rex", 3)
mimi = Hund("Mimi", 5)
print(rex.name, rex.alter)
print(rex.bellen())
print(mimi.bellen())
print(type(rex))class Unter(Ober): erbt alles von der Oberklassesuper() ruft die Oberklasse aufisinstance, issubclass, __mro__ für TypfragenABC und @abstractmethodclass Tier:
def __init__(self, name):
self.name = name
def laut(self):
return "..."
def vorstellen(self):
return f"{self.name} macht {self.laut()}"
class Hund(Tier):
def laut(self):
return "Wuff"
class Katze(Tier):
def laut(self):
return "Miau"
for t in [Hund("Rex"), Katze("Mimi"), Tier("Etwas")]:
print(t.vorstellen())__add__, __eq__, __lt__ & Co. überladen Operatoren__len__, __getitem__, __contains__ machen Objekte zu Sammlungen__call__ macht Objekte aufrufbar__enter__/__exit__ bauen eigene with-Blöcke@total_ordering spart Vergleichsmethodenclass Vektor:
def __init__(self, x, y):
self.x, self.y = x, y
def __add__(self, o):
return Vektor(self.x + o.x, self.y + o.y)
def __mul__(self, k):
return Vektor(self.x * k, self.y * k)
def __eq__(self, o):
return (self.x, self.y) == (o.x, o.y)
def __repr__(self):
return f"Vektor({self.x}, {self.y})"
a, b = Vektor(1, 2), Vektor(3, 4)
print(a + b)
print(a * 3)
print(a + b == Vektor(4, 6))@dataclass erzeugt __init__, __repr__, __eq__ automatischfrozen=True macht unveränderlich, order=True sortierbarfield(default_factory=...)@property macht aus einer Methode ein Attribut, @x.setter prüft Zuweisungen__slots__ beschränkt Attribute und spart Speicherfrom dataclasses import dataclass
@dataclass
class Person:
name: str
alter: int
stadt: str = "Köln"
p = Person("Mia", 17)
print(p)
print(p == Person("Mia", 17))
p.alter += 1
print(p.alter)x: int annotiert Variablen, -> str den Rückgabewertlist[int], dict[str, int], tuple[int, int] für Sammlungenint | None für optionale WerteCallable, Literal, TypedDict, Any für Sonderfällename: str = "Mia"
alter: int = 17
preis: float = 9.99
aktiv: bool = True
def begruessen(name: str, laut: bool = False) -> str:
text = f"Hallo {name}"
return text.upper() if laut else text
print(begruessen("Tom"))
print(begruessen("Tom", laut=True))
print(begruessen.__annotations__)assert ist der einfachste Test, unittest ist eingebautassert, parametrize und Fixturesdef addiere(a, b):
return a + b
assert addiere(2, 3) == 5
assert addiere(-1, 1) == 0
print("alle Prüfungen bestanden")
try:
assert addiere(2, 2) == 5, "2 + 2 sollte 4 sein"
except AssertionError as e:
print("Fehler:", e)sys.argv enthält die Rohargumenteargparse.ArgumentParser baut Positionsargumente, Optionen und Schaltertype=, default=, choices= und help= steuern Prüfung und Hilfe-h erzeugt automatisch eine Hilfeadd_subparsersif __name__ == "__main__": main() als Einstiegspunktimport sys
# Simuliert: python programm.py hallo welt
sys.argv = ["programm.py", "hallo", "welt"]
print(sys.argv[0])
print(sys.argv[1:])Lock schützt gemeinsame Daten vor Wettlaufsituationenconcurrent.futures bietet Pools für Threads und Prozesseasync def und await bilden Coroutinen; asyncio.run startet sie, gather bündeltimport threading, time
def arbeiter(name, dauer):
time.sleep(dauer)
print(f"{name} fertig")
start = time.perf_counter()
t1 = threading.Thread(target=arbeiter, args=("A", 0.3))
t2 = threading.Thread(target=arbeiter, args=("B", 0.1))
t1.start(); t2.start()
t1.join(); t2.join() # warten, bis beide fertig sind
print("zusammen unter 0.5 s:", time.perf_counter() - start < 0.5)snake_case, 4 Leerzeichen, aussagekräftige Namenenumerate, zip, with, join, any/allexcept:import contextlib, io
text = io.StringIO()
with contextlib.redirect_stdout(text):
import this # druckt das Gedicht beim Import
zeilen = text.getvalue().splitlines()
print(zeilen[2])
print(zeilen[3])
print(zeilen[6])