Abschnitt 8 · Lektion 2
Rückgabewerte
euro schreibt einen Betrag so, wie man ihn in Deutschland schreibt. Solange er allein in einer
Zeile steht, reicht das. Auf einer Rechnung steht er aber meistens in einem Satz.
def euro(betrag):
text = f"{betrag:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".")
print(text + " €")
print("Der Fernseher kostet", euro(1299), "im Angebot.") Heraus kommen zwei Zeilen. Keine davon stimmt. Erst steht der Betrag allein da. Darunter steht
Der Fernseher kostet None im Angebot.
Das liegt an der Reihenfolge, in der Python arbeitet. Bevor print seine Zeile schreiben kann,
braucht es alle drei Werte in seinen Klammern. Für den mittleren ruft Python deshalb zuerst
euro(1299) auf, und die Funktion gibt den Betrag gleich selbst aus, in einer eigenen Zeile. So
steht es in ihrem Rumpf. Danach ist sie fertig.
An der Stelle des Aufrufs bleibt dann das übrig, was die Funktion zurückgegeben hat. Zurückgegeben
hat sie aber nichts, und für „nichts“ hat Python den Wert None aus Lektion 3.5. Den setzt print
brav in den Satz.
Ein Ergebnis zurückgeben
def brutto(netto):
return netto * 1.19
preis = brutto(100)
print(preis)
print(brutto(100) + 5)
print(f"Mit Steuer: {brutto(250):.2f} Euro") return (zurückgeben) beendet eine Funktion und gibt einen Wert an die Stelle zurück, an der sie
aufgerufen wurde. Der Aufruf brutto(100) wird damit selbst zu einem Wert, hier 119.0. Er darf
überall stehen, wo ein Wert stehen darf, also rechts von einem Gleichheitszeichen, in einer Rechnung
oder in einem f-String.
Was mit dem Ergebnis passiert, entscheidet jetzt nicht mehr die Funktion. Das entscheidest du an der
Stelle, an der du sie aufrufst. Einmal landet es in preis, einmal kommen 5 Euro Versand dazu,
einmal steht es mit zwei Nachkommastellen in einem Satz.
Eine Funktion mit return ist damit so etwas wie die eingebauten, die du schon kennst.
len(einkauf) gibt die Zahl der Einträge nicht aus, sondern zurück, und deshalb kannst du
len(einkauf) + 1 schreiben oder if len(einkauf) > 3:. Von den Funktionen, die du bisher benutzt
hast, gibt fast nur print etwas aus. Das ist ja auch ihr einziger Zweck.
Ausgeben statt zurückgeben
def brutto(netto):
print(netto * 1.19)
preis = brutto(100)
print(preis)
print(brutto(100) + 5) Hier steht in derselben Funktion print statt return. Die 119.0 erscheint zwar, aber nur auf dem
Bildschirm. In preis landet None, denn jede Funktion ohne return gibt von selbst None
zurück. In der letzten Zeile endet es dann mit
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'.
Übersetzt heißt das, dass Plus zwischen NoneType und int nicht geht. NoneType ist der Typ von
None, so wie int der Typ ganzer Zahlen ist. Wenn du diese Meldung siehst, hast du fast immer
eine Funktion aufgerufen, die ihr Ergebnis ausgibt, statt es zurückzugeben.
Der Unterschied ist leicht zu übersehen, weil beide Fassungen beim ersten Ausprobieren gleich
aussehen. Ein print zeigt einem Menschen, was herauskam, und danach hat das Programm es vergessen.
Ein return gibt es dem Programm, und das kann damit weiterarbeiten.
Ab hier gilt im Kurs deshalb, dass eine Funktion, die etwas ausrechnet, ihr Ergebnis zurückgibt.
Ausgegeben wird an der Stelle, an der das Programm etwas zeigen will. Die trennlinie aus der
letzten Lektion darf ausgeben, denn eine Linie auf den Bildschirm zu bringen ist ihre ganze Aufgabe.
Zwei Wege zurück
def versand(summe):
if summe >= 50:
return 0
return 4.90
print("Diese Zeile läuft nie.")
print(versand(23.40))
print(versand(50))
print(versand(89.99)) return beendet die Funktion sofort, und das kann man ausnutzen. Ab 50 Euro ist der Versand frei,
und die Funktion gibt gleich 0 zurück. Die Zeile darunter kommt nur noch dran, wenn das if nicht
gegriffen hat. Ein else braucht es deshalb nicht.
Bei genau 50 Euro kommt 0 heraus. Die Grenze gehört also zum freien Versand. Und die 4.90 steht als
4.9 da, weil eine Zahl keine Null am Ende hat. Zwei Nachkommastellen sind eine Frage der Ausgabe
und nicht des Werts.
Die letzte Zeile der Funktion, das print, läuft nie, weil vor ihr ein return steht, das immer
greift. Python beschwert sich darüber nicht. Code hinter einem return im selben Block ist toter
Code, und der bleibt einfach liegen.
Wie ab jetzt geprüft wird
from main import brutto, gruss, gruss_laut
print("brutto(100) gibt", repr(brutto(100)), "zurück")
print("gruss('Mia') gibt", repr(gruss("Mia")), "zurück")
print("gruss_laut('Mia') gibt", repr(gruss_laut("Mia")), "zurück") def brutto(netto):
return round(netto * 1.19, 2)
def gruss(name):
return f"Hallo {name}!"
def gruss_laut(name):
print(f"Hallo {name}!") Mit Funktionen ändert sich, wie die Aufgaben in diesem Kurs geprüft werden. Bisher wurde nachgesehen, was dein Programm ausgibt. Eine Funktion, die etwas ausrechnet, prüft man aber besser dort, wo ihr Ergebnis ankommt, indem man sie mit ein paar Werten aufruft und nachsieht, was zurückkommt.
Dafür gibt es ab jetzt eine Datei pruefen.py, so wie hier im Beispiel. Die erste Zeile holt die
Funktionen aus main.py herüber, damit pruefen.py sie benutzen kann. Wie dieses import genau
funktioniert, kommt in Abschnitt 10. Für jetzt reicht, dass es die drei Namen danach auch in
pruefen.py gibt.
Darunter steht je Aufruf eine Zeile. repr() zeigt den Wert, der zurückkam, so wie man ihn in
Python hinschreiben würde. Text steht dann in Anführungszeichen, 'Hallo Mia!', eine Zahl ohne, und
bei gruss_laut steht None. Die Funktion hat ihren Gruß ausgegeben, eine Zeile darüber, aber
nichts zurückgegeben.
In den Aufgaben liegt pruefen.py im Dateibaum, damit du nachlesen kannst, womit geprüft wird.
Gestartet wird dann pruefen.py, und deine Funktion steht wie immer in main.py. Damit die Datei
kurz bleibt, schreibt dort eine Funktion pruefe() jede Zeile in genau dieser Form. Sie liegt
daneben in pruefhilfe.py, und die musst du nicht lesen. So arbeiten übrigens auch richtige Tests,
und die kommen in Abschnitt 15.
Was die Aufgabe will
euro kommt zum zweiten Mal, diesmal mit return. Die Funktion soll einen Betrag als deutschen
Text zurückgeben, damit er in jedem Satz stehen kann. Geprüft wird über pruefen.py, mit großen,
kleinen und negativen Beträgen.
Zum Mitnehmen
Was eine Funktion mit return zurückgibt, kann das Programm in eine Variable legen, damit weiterrechnen oder in einen Satz setzen. Ein print zeigt das Ergebnis nur einem Menschen, und zurück kommt dabei None.
Jetzt du
Basis Konto, kostenlosZu dieser Lektion gehört eine Aufgabe. Du schreibst den Code selbst, und nach jedem Lauf sagt dir eine Prüfliste, was schon stimmt.
Dafür brauchst du das Basis Konto. Es kostet nichts, und ein Passwort gibt es auch nicht.
In diesem Kurs läuft dein Code auf einem Server. Dafür hat das Basis Konto 1 Stunde im Monat, mehr Zeit gibt es mit dem Premium Konto.
Was in dieser Lektion steckt
-
Artikel mit 5 Beispielen zum Ausprobieren
Steht hier, ohne Konto lesbar.
-
Aufgabe, dein Code läuft auf einem Server
Öffnet sich mit dem Basis Konto.