Ausdrucksstärkere Funktionen · Übung
Beschreibe Werte mit Typhinweisen
Die vorige Lektion hat mit einem Docstring die Zusage einer Funktion in vollständigen Sätzen beschrieben. Manchmal brauchen Leser außerdem eine kurze Übersicht über die Arten von Werten, die in eine Funktion hineingehen und aus ihr herauskommen.
Python erlaubt dir, solche Hinweise direkt zur Funktionsdefinition hinzuzufügen. Sie heißen Typhinweise oder Type Hints.
Gib den Typ eines Parameters an
Beginne mit einer gewöhnlichen Funktion:
def repeat(text, times):
return text * times
Um anzugeben, dass text ein String sein sollte, schreibe nach dem Parameter einen Doppelpunkt und den Typnamen:
def repeat(text: str, times):
return text * times
Das : str ist ein Typhinweis. Es sagt, dass die Funktion für text einen String erwartet.
Du kannst jedem Parameter einen eigenen Hinweis geben:
def repeat(text: str, times: int):
return text * times
Lies diese Definition so: „repeat erwartet einen String namens text und eine ganze Zahl namens times.“
Der Hinweis verwendet einen Typnamen wie str, int, float oder bool. Er verwendet keinen Beispielwert. Schreibe deshalb text: str und nicht text: "hello".
Gib den Rückgabetyp an
Ein Hinweis nach einem Pfeil beschreibt den Wert, den die Funktion zurückgibt:
def repeat(text: str, times: int) -> str:
return text * times
Das -> str sagt, dass repeat einen String zurückzugeben verspricht. Der Pfeil gehört hinter die schließende Klammer und vor den Doppelpunkt, der die def-Zeile beendet.
Hier ist eine Durchschnittsfunktion mit allen drei Hinweisen:
def average(total: int, count: int) -> float:
return total / count
Du kannst sie von links nach rechts lesen:
total: intsagt, dasstotaleine ganze Zahl sein sollte;count: intsagt, dasscounteine ganze Zahl sein sollte;-> floatsagt, dass die Funktion eine Fließkommazahl zurückgeben sollte.
Der Funktionsaufruf ändert sich nicht:
result = average(21, 3)
Die Hinweise gehören zur Definition, nicht zu jedem Aufruf.
Sieh dir Typhinweise mit help() an
In der vorigen Lektion hast du mit help() den Docstring einer Funktion gelesen. Dieselbe Ausgabe zeigt auch ihre Typhinweise.
Führe dieses Beispiel aus:
help() fasst die Funktion so zusammen:
average(total: int, count: int) -> float
Die Hinweise zu Parametern und Rückgabe stammen aus der Funktionsdefinition. Der Satz darunter stammt aus dem Docstring. Zusammen zeigen sie beide Arten von Dokumentation, ohne dass jemand den Funktionskörper lesen muss.
Hinweise beschreiben, sie erzwingen nichts
Python lehnt einen Wert nicht automatisch ab, nur weil er einem Typhinweis widerspricht:
Der zweite Aufruf übergibt einen String, obwohl der Hinweis int lautet. Python führt den Funktionskörper trotzdem aus, und die Multiplikation des Strings erzeugt "haha".
Der Funktionskörper bestimmt weiterhin, was während der Programmausführung geschieht.
Das unterscheidet sich von vielen anderen Programmiersprachen. In statisch typisierten Sprachen wie Java, C# und Rust gehören deklarierte Typen zu den Regeln der Sprache. Die Übergabe des falschen Typs wird normalerweise vor der Programmausführung abgelehnt. Pythons Typhinweise liefern hilfreiche Informationen, werden von Python aber nicht automatisch erzwungen.
Unterstütze automatische Prüfwerkzeuge
Typhinweise sind besonders nützlich für Werkzeuge, die Code auf wahrscheinliche Fehler untersuchen. Ein Linter ist ein allgemeines Werkzeug zur automatischen Codeprüfung. Ein Typprüfer konzentriert sich darauf, ob Werte zu den Typhinweisen passen.
Zum Beispiel kann ein Typprüfer diesen Aufruf mit der Definition oben vergleichen:
double("ha")
Er kann warnen, dass double einen int erwartet, der Aufruf aber einen str übergibt. Der Prüfer kann diese Abweichung finden, ohne das Programm auszuführen. Codeeditoren zeigen solche Hinweise möglicherweise schon beim Tippen an.
Der Hinweis ändert Pythons Verhalten zur Laufzeit nicht: Wie das ausführbare Beispiel gezeigt hat, führt Python selbst den Aufruf weiterhin aus. Typhinweise geben Menschen und automatischen Prüfwerkzeugen mehr Informationen, um einen wahrscheinlichen Fehler früher zu erkennen.
Deshalb sind zutreffende Hinweise wichtig. Ein falscher Hinweis kann die nächste Person irreführen, die die Funktion verwendet.
Welche Definition sagt, dass name ein String sein sollte und die Funktion einen String zurückgibt?
Ergänze eine vorhandene Funktion um Hinweise
Die Prozentfunktion berechnet bereits das richtige Ergebnis. Füge nur die Typhinweise hinzu, die ihre beiden Parameter und ihren Rückgabewert beschreiben. Die nächste Lektion verwendet diesen Rückgabewert, um reine Funktionen mit Seiteneffekten zu vergleichen.
Aufgabe
Füge der vorhandenen Funktion percentage Typhinweise hinzu.
Gib an, dass
scoreeinintist.Gib an, dass
totaleinintist.Gib an, dass die Funktion einen
floatzurückgibt.Ändere weder die Berechnung noch den Aufruf unter der Funktion.
Nur die def-Zeile muss geändert werden.