Lektion 33 von 35Python
Python · Lektion 33 · 20 Minuten
Type Hints – Typen angeben
Das lernst du
- Parameter und Rückgabewerte mit Typen beschriften
list[int],dict[str, int]und Optionales lesen- Dataclasses für einfache Datenobjekte nutzen
Was steckt in der Variable?
Python ist es egal, welchen Typ eine Variable hat. Für Menschen (und Editoren) ist es aber sehr hilfreich zu wissen, was eine Funktion erwartet. Type Hints schreiben das direkt dazu:
def begruessung(name: str, alter: int) -> str:
return f"{name} ist {alter} Jahre alt."
print(begruessung("Mia", 12))
print(begruessung.__annotations__)Hinter dem Doppelpunkt steht der Typ eines Parameters, hinter -> der Typ des Rückgabewerts.
Wichtig: Python prüft die Typen beim Ausführen nicht. Hints sind Beschriftungen – Werkzeuge wie
mypyoder dein Editor warnen dich damit aber vor Fehlern, bevor das Programm läuft.
Typen für Listen und Dictionaries
def bestes_team(punkte: dict[str, int]) -> str:
return max(punkte, key=punkte.get)
def nur_gerade(zahlen: list[int]) -> list[int]:
return [z for z in zahlen if z % 2 == 0]
def finde(namen: list[str], gesucht: str) -> int | None:
if gesucht in namen:
return namen.index(gesucht)
return None
print(bestes_team({"Rot": 3, "Blau": 7}))
print(nur_gerade([1, 2, 3, 4]))
print(finde(["Mia", "Ben"], "Tom"))int | None bedeutet: „eine Zahl – oder gar nichts“.
Dataclasses
Für Klassen, die vor allem Daten speichern, gibt es eine Abkürzung. @dataclass schreibt __init__ und eine schöne Anzeige für dich – aus den Type Hints:
from dataclasses import dataclass
@dataclass
class Roboter:
name: str
akku: int = 100
r = Roboter("Robo")
print(r)
r.akku -= 15
print(r.akku)Kurz-Check
Bevor es an die Aufgabe geht: Was gibt dieses Programm aus? Tipp deine Vermutung ein – Python rechnet danach nach.
def flaeche(breite: int, hoehe: int) -> int:
return breite * hoehe
print(flaeche(3, 4), flaeche("ab", 2))Deine Aufgabe
Jetzt bist du dran
Ergänze die Funktion durchschnitt mit Type Hints: Sie bekommt eine Liste von Kommazahlen (list[float]) und gibt eine Kommazahl (float) zurück. Bei einer leeren Liste soll sie 0.0 liefern. Erstelle außerdem eine Dataclass Spieler mit name: str und punkte: int.
from dataclasses import dataclass
def durchschnitt(werte):
return sum(werte) / len(werte)
# Dataclass Spieler
print(durchschnitt([2.0, 3.0, 4.0]))
print(durchschnitt([]))- Denkanstoß
So sieht die erste Zeile aus:
defdurchschnitt(werte: list[float])->float: - Welcher Befehl hilft?
Prüfe mit
ifnotwerte: und gib 0.0 zurück, bevor du teilst.Schreib
@dataclassüber die Klasse und darin die zwei Zeilen name:strund punkte:int. - Lückencode – ergänze die ___
from dataclasses import dataclass def durchschnitt(werte: list[float]) -> float: if ___: return ___ return sum(werte) / len(werte) ___ class Spieler: ___ ___ print(durchschnitt([2.0, 3.0, 4.0])) print(durchschnitt([]))
Ohne Hinweise gelöst gibt es einen ⭐ auf deiner Fortschrittsseite.
Lösung anzeigen🔒 Erst nach allen Hinweisen oder 2 Prüf-Versuchen
Versuch es erst selbst – aus Fehlern lernt man am meisten. Hier ist eine mögliche Lösung:
from dataclasses import dataclass
def durchschnitt(werte: list[float]) -> float:
if not werte:
return 0.0
return sum(werte) / len(werte)
@dataclass
class Spieler:
name: str
punkte: int
print(durchschnitt([2.0, 3.0, 4.0]))
print(durchschnitt([]))