mitmario.dev

Rückgabewerte

Python Sandbox 4 Min Lesezeit 5 BeispieleLektion 2 von 9

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.

Euro mitten im 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

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

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

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

Eine Datei, die prüft
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, kostenlos

Zu 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.