Zu Rückgaben in Python
Rückgabe und Ausgabe
Die Funktion ›f‹ gibt »a« aus und «9» zurück. Man beachte den Unterschied zwischen Rückgabe und Ausgabe!
main.py
def f():
print( 'a' )
return 9
print( 'b' )print( 'f() =', f() )
- Protokoll
a
f() = 9
Anweisungen hinter einer return-Anweisung werden nicht ausgeführt. Daher wird »b« nicht ausgegeben.
Das Ignorieren eines Rückgabewertes
Rückgabewerte werden von einer Funktion nur bereitgestellt, sie müssen vom Aufrufer nicht verwendet werden, sondern können auch ignoriert werden.
main.py
def f():
print( 'a' )
return 9
print( 'b' )_ = f()
- Protokoll
a
Die Faulheit des Und-Operators
- Protokoll
def t(): print( 'true' ); return True
def f(): print( 'false' ); return False
f() and t()
false
False
t() and f()
true
false
False
Die Faulheit des Oder-Operators
Ein Operand wird nur ausgewertet, falls dies nötig ist, um den Wert der oder-Verknüpfung festzulegen.
- Protokoll
def t(): print( 'true' ); return True
def f(): print( 'false' ); return False
t() or f()
true
True
f() or t()
false
true
True
Unterschiedliche Objekte ⃗
Das folgende Skript zeigt zwei verschiedene Objekte mit demselben Wert.
main.py
def p( o ):
print( o )
return op( id( str( 10000 )))+ p( id( str( 10000 )))
- Protokoll
14248800
17965288
(Die Ausgabe unterschiedlicher Werte kann in diesem Fall nicht notwendigerweise unter jeder Python -Implementation nachvollzogen werden. Sie ist bei CPython 2019 in der Konsole beobachtbar, nicht jedoch bei der Ausführung eines Skripts aus einer Datei.)
Fehlen einer Rückgabe ⃗
Die folgende Funktionsdefinition ist zwar erlaubt, aber sie legt keinen Wert für den Aufruf der damit definierten Funktion fest.
main.py
def f():
8f()
print( 'f() =', f() )
- Protokoll
f() = None
Die folgende Funktionsdefinition legt für einen Aufruf der Funktion ›f‹ den Wert «8» fest.
main.py
def f():
return 8f()
print( 'f() =', f() )
- Protokoll
f() = 8
Man sagt auch, daß die Funktion den Wert «8» zurückgebe oder als Ergebnis liefere.
Unterschied zu Variablen ⃗
Im Gegensatz zu einer Variablen wird der Ausdruck hinter »return« bei jedem Aufruf neu ausgewertet.
- Konsolenprotokoll
from random import random
f = random()
print( f )
0.12329825050776
print( f )
0.12329825050776
def f():
return random()print( f() )
0.975561694638642
print( f() )
0.741446428431578
lambda-Bindungen
Wir bezeichnen lambda-Bindungen auch manchmal als Funktionsdefinitionen, obwohl sie keine Funktionsdefinitionen im engeren Sinne des Wortes sind.
Eine mit einer lambda-Bindung definierte Funktion ähnelt einer mit »def« definierten Funktion. Eine lambda-Funktion darf aber immer nur genau einen Ausdruck enthalten und gibt immer dessen Wert zurück, ohne daß »return« verwendet wird.
- Konsolenprotokoll
from random import random
f = lambda: random()
print( 'f() =', f() )
f() = 0.298523876843897
print( 'f() =', f() )
f() = 0.238597287623957
def-Definition sind für Funktionen gedacht, die einen Namen haben sollen.
lambda-Ausdrücke sind für Funktionen gedacht, die ohne Namen angegeben werden sollen. (Wir werden später Fälle kennenlernen, in denen sie verwendet werden.)
lambda-Bindungen sollten in der Regel vermieden werden; denn wenn eine Funktion einen Namen haben soll, dann ist es besserer Stil, gleich eine def-Definition zu verwenden. (Quelle: PEP 8)
- lambda-Bindung Bindung einer lambda-Funktion an einen Namen
- lambda-Funktion Wert eines lambda-Ausdrucks
- lambda-Ausdruck ein mit »lambda« beginnender Ausdruck
Meinungen zur Lambda-Schreibweise
https://towardsdatascience.com/what-are-lambda-functions-in-python-and-why-you-should-start-using-them-right-now-75ab85655dc6
- You can see that this definition is much simpler than the normal python function definition you are used to.
It is simple, concise, and can be written in a single line of code. - …
- As a Data Scientist, you will work a lot with pandas library and this is a place where you will be using lambda notation often.
- Übersetzung (autom.), Unterstreichungen und Anmerkungen in Klammern von Stefan Ram
- (Zum Thema der Lambda-Funktionen:)
- Sie sehen, dass diese Definition viel einfacher ist als die normale Pythonfunktionsdefinition (= Definition mit "def"), an die Sie (vielleicht) gewöhnt sind.
Sie ist einfach, prägnant und kann in einer einzigen Codezeile geschrieben werden. - …
- Als Datenwissenschaftler werden Sie viel mit der Pandabibliothek arbeiten, und dies ist ein Ort, an dem Sie häufig die Lambda-Notation verwenden werden.
Vorteile von Wertfunktionen ⃗
Im Gegensatz zu einer Wirkfunktion, die Zufallszahlen ausgibt, können die Werte einer Wertfunktion im Programm weiterverarbeitet werden.
- Konsolenprotokoll
def wirk():
print( random() )def wert():
return random()wirk()
0.7836739471233391
wirk()
0.52489149943197702
print( wert() )
0.5274242742627173
print( wert() + wert() )
1.625218866860633
Die Rückgabeanweisung beendet auch die Ausführung der Anweisungsfolge.
Wir können aber auch eine Funktion schreiben, die einen Wert ausgibt und zurückgibt (eine Wertwirkfunktion).
- Protokoll
def wertwirk():
r = random()
print( r )
return r
Fachsprache
Im folgenden nennen wir in den Aufgaben verwendete Fachverben und dann typischerweise damit verbundene Sprachelemente.
- Tabelle
einlesen (eingeben) input
ausgeben print
zurueckgeben, ergeben, berechnen, liefern return
Das heißt:
- Wenn eine Funktion etwas einlesen soll: »input« verwenden.
- Wenn der Bediener etwas eingeben können soll: »input« verwenden.
- Wenn eine Funktion etwas ausgeben soll: »print« verwenden.
- Wenn eine Funktion etwas zurückgeben soll: »return« verwenden.
- Wenn eine Funktion etwas ergeben soll: »return« verwenden.
- Wenn eine Funktion etwas berechnen soll: »return« verwenden.
- Wenn eine Funktion etwas liefern soll: »return« verwenden.
Darstellung der Faulheit von Vergleichen ⃗
- Protokoll
def f():
print( "f" )
return 48 < 6 < f()
False
Darstellung der Faulheit von »and« ⃗
- Konsolenprotokoll
def t():
print( "t" )
return Truedef f():
print( "f" )
return Falsef() and f()
f
Falsef() and t()
f
Falset() and f()
t
f
Falset() and t()
t
t
True
Darstellung der Faulheit von »or« ⃗
- Konsolenprotokoll
def t():
print( "t" )
return Truedef f():
print( "f" )
return Falsef() or f()
f
f
Falsef() or t()
f
t
Falset() or f()
t
Truet() or t()
t
True
Rückgabe von »None« ⃗
Der Wert »None« wird von der Konsole nicht ausgegeben.
- Protokoll
def f():
return Nonef()
- (keine Ausgabe)
Die Anweisung »return« hat dieselbe Bedeutung wie die Anweisung »return None«.
- Protokoll
def f():
returnf()
- (keine Ausgabe)
Wenn eine Funktion nichts zurückgibt, so erhält ein Aufrufer den Wert »None«. Insofern hat »def f(): pass« dieselbe Bedeutung wie »def f(): return«.
- Konsolenprotokol
def f():
passprint( 'f() =', f() )
f() = None
Rückgabe einer Funktion ⃗
Das folgende Beispiel zeigt die Rückgabe einer Funktion.
- Konsolenprotokoll
from random import random
def f():
return randomprint( 'f =', f )
f = <function f at 0x0000000001CE3E18>
- Protokoll
print( 'f() =', f() )
f() = <built-in method random of Random object at 0x00000000004E3FF8>
- Protokoll
print( 'f()() =', f()() )
f()() = 0.6857898971232789
Rückgabe einer lambda-Funktion ⃗
Das folgende Beispiel zeigt die Rückgabe einer lambda-Funktion, das heißt: von »f« wird ein Wert zurückgegeben, bei dem es sich um eine lambda-Funktion handelt.
- Protokoll
def f():
return lambda x: x+x- Protokoll
print( f()( 2 ))
4
- Protokoll
l = f()
print( l( 2 ))
4
Während eine lambda-Bindung, die an »= lambda« erkennbar ist, als schlechter Stil gilt, gelten andere Verwendungen von »lambda« (wie oben) nicht als schlechter Stil.
- lambda-Bindung Bindung einer lambda-Funktion an einen Namen
- lambda-Funktion Wert eines lambda-Ausdrucks
- lambda-Ausdruck ein mit »lambda« beginnender Ausdruck
Übungsfragen
? Übungsfrage 0
Ergänzen Sie den Lückentext mit einem Wort: „Die Funktion »g« gibt 3 __________ .“
- Quelltext
def g():
return 3
? Übungsfrage 1
Ergänzen Sie den Lückentext mit einem Wort: „Die Funktion »h« gibt 3 __________ .“
- Quelltext
def h():
print( end='3' )
? Übungsfrage 2
Ist die Funktion »r« eine Wirkfunktion oder eine Wertfunktion?
- Eine Funktion ist eine Wirkfunktion, wenn die Auswertung ihres Aufrufs eine Änderung hervorruft (oder zumindest unter bestimmten Umständen hervorrufen könnte).
- Eine Funktion ist eine Wertfunktion, wenn die Auswertung ihres Aufrufs einen Wert ergibt (hier gilt das Objekt ›None‹ nicht als Wert).
- Die bloße Berechnung oder Rückgabe eines Wertes gilt nicht als Hervorrufen einer Änderung
- Quelltext
def r():
return 2
? Übungsfrage 3 ⃖
Welche Ausgabe ergibt die Ausführung des folgenden Skripts?
- Skript
def f():
print( 3 )_ = f()
? Übungsfrage 4 ⃖
Welche Ausgabe ergibt die Ausführung des folgenden Skripts?
- Skript
def f():
return 4print( f() )
? Übungsfrage 5 ⃖
Welche Ausgabe ergibt die Ausführung des folgenden Skripts?
- Skript
def f():
return 5_ = f()
? Übungsfrage 6 ⃖
Welche Ausgabe ergibt die Ausführung des folgenden Skripts?
- Skript
def f():
print( 6 )print( f() )
? Übungsfrage 7 ⃖
Welche Ausgabe ergibt die Ausführung des folgenden Skripts?
- Skript
def f():
print( 7 )
return 4print( f() )
? Übungsfrage 8 ⃖
Welche Ausgabe ergibt die Ausführung des folgenden Skripts?
- Skript
def f():
print( 8 )
return 4_ = f()
? Übungsfrage 9 ⃖
Welche Ausgabe ergibt die Ausführung des folgenden Skripts?
- Skript
def f():
print( 9 )_ = print( f() )
? Übungsfrage 10
Welche Ausgabe ergibt die Ausführung des folgenden Skripts?
- Skript
def f():
return 10print( f() + f() )
? Übungsfrage 11
Welche Ausgabe ergibt die Ausführung des folgenden Skripts?
- Skript
def f():
print( 11 )
return 2_ = f() + f()
? Übungsfrage 12
Welche Ausgabe ergibt die Ausführung des folgenden Skripts?
- Skript
def f():
print( 12 )
return 2print( f() + f() )
? Übungsfrage 13
Welche Ausgabe ergibt die Ausführung des folgenden Skripts?
- Skript
def f():
print( 13 )
return 2print( 2 * f() )
? Übungsfrage 14 ⃗
Welche Ausgabe erzeugt das folgende Skript?
- Quelltext
def w():
return 14
def e():
print( w() )
w()
e()
? Übungsfrage 15 ⃗
Welche Ausgabe erzeugt das folgende Programm?
- Quelltext
def alpha():
return 15
def gamma():
return alpha() * 4
print( gamma() )
? Übungsfrage 16 ⃗
Welche Ausgabe erzeugt das folgende Programm?
- Quelltext
def i():
print( end='1' )
return 16
print( 2 * i() )
? Übungsfrage 17
Welche Ausgabe erzeugt das folgende Programm?
- Quelltext
def u():
print( end='grau' )
return 2
def v():
print( end='blau' )
return 3
def w():
x = u()
y = v()
print()
w()
? Übungsfrage 18
Welche Ausgabe erzeugt das folgende Programm?
- Quelltext
def alpha():
print( end='1' )
return 2
def gamma():
print( end='3' )
return 4
print( alpha() * gamma() )
? Übungsfrage 19 ⃗
Welche Ausgabe erzeugt das folgende Programm?
- Quelltext
def alpha():
return 12
def gamma():
return 4
def delta():
return alpha
print( delta()() )
? Übungsfrage 20
Welche Ausgabe erzeugt das folgende Programm?
main.py
def f():
print( 7 )
return 3_ = f() + 1
? Übungsfrage 21
Welche Ausgabe erzeugt das folgende Programm?
main.py
def f():
print( 7 )
return 3x = f() + 1
print( x + 1 )
Übungsaufgaben
Für alle Funktionsdefinitionen in diesem Kapitel soll »def« verwendet werden und nicht »= lambda«.
/ Funktionsdefinition ⃖
Schreiben Sie eine def-Definition einer Funktion namens »a7«, die das Zeichen »7« ausgibt.
Die Funktion soll außer dem im ersten Absatz Beschriebenen nichts anderes machen und nichts Überflüssiges enthalten.
/ Funktionsdefinition 1 ⃖
Hinweis für den Dozenten ► Diese Übungsaufgabe sollte erst nach der Nachbesprechung der vorherigen Übungsaufgabe behandelt werden.
Schreiben Sie eine def-Definition einer Funktion namens »z7«, welche die Zahl «7» zurückgibt.
Die Funktion soll außer dem im ersten Absatz Beschriebenen nichts anderes machen und nichts Überflüssiges enthalten.
/ Funktionsdefinition 2 ⃖
Hinweis für den Dozenten ► Diese Übungsaufgabe sollte erst nach der Nachbesprechung der vorherigen Übungsaufgabe behandelt werden.
Schreiben Sie eine def-Definition einer Funktion namens »az7«, die das Zeichen »7« ausgibt und die Zahl «7» zurückgibt.
Die Funktion soll außer dem im ersten Absatz Beschriebenen nichts anderes machen und nichts Überflüssiges enthalten.
/ Funktionsdefinition 3 ⃖
Hinweis für den Dozenten ► Diese Übungsaufgabe sollte erst nach der Nachbesprechung der vorherigen Übungsaufgabe behandelt werden.
Schreiben Sie eine def-Definition einer Funktion »get«, die eine Zeichenfolge einliest und das Ergebnis der Umwandlung dieser Zeichenfolge in eine ganze Zahl (vom Typ »int«) zurückgibt. (Es ist egal, was die Funktion tut, falls kein Numerale eingegeben wird.)
Schreiben Sie dann eine def-Funktionsdefinition für eine Funktion, die eine ganze Zahl einliest und das Doppelte jener Zahl ausgibt.
Die Funktionen soll außer dem oben Beschriebenen nichts anderes machen und nichts Überflüssiges enthalten.
/ Funktionsdefinition 4 ⃗
Hinweis für den Dozenten ► Diese Übungsaufgabe sollte erst nach der Nachbesprechung der vorherigen Übungsaufgabe behandelt werden.
Schreiben Sie eine def-Definition einer Funktion »read«, die eine Zeichenfolge einliest und das Ergebnis der Umwandlung dieser Zeichenfolge in eine Gleitkommazahl (vom Typ »float«) zurückgibt.
Schreiben Sie dann eine def-Definition einer Funktion, die eine Gleitkommazahl einliest und das Doppelte jener Zahl ausgibt.
/ Funktionsdefinition 5 ⃗
Schreiben Sie die folgende Definition einer Funktion mit »lambda« in eine Definition einer gleichnamigen Funktion mit »def« um, welche dasselbe Ergebnis wie die lambda-Funktion liefert.
- Quelltext
f = lambda: 7
/ Funktionsdefinition 6 ⃗
Schreiben Sie die folgende Definition einer Funktion mit »def« in eine Definition einer gleichnamigen Funktion mit »lambda« um, welche dasselbe Ergebnis wie die def-Funktion liefert.
- Quelltext
def g():
return 'abc'
Zusatzaufgaben →
/ Funktionsdefinition →
Definieren Sie unter Zuhilfenahme der Funktion »random« (aus dem Standardmodul »random«) mit »def« eine Funktion »wurf«, deren mit einer Wahrscheinlichkeit von 50 Prozent den Wert 0 und mit einer Wahrscheinlichkeit von 50 Prozent den Wert 1 ergibt.
/ Funktionsdefinition →
Definieren Sie unter Zuhilfenahme der Funktion »random« (aus dem Standardmodul »random«) mit »def« eine Funktion »wuerfel«, die eine zufällige ganze Zahl zwischen 1 (einschließlich) und 6 (einschließlich) ergibt.
/ Funktionsdefinition *
Definieren Sie unter Zuhilfenahme der Funktion »wurf« (Lösung der vorherigen Aufgabe) mit »def« ein Funktion »spiel()«, deren Aufruf mit einer Wahrscheinlichkeit von 50 Prozent den Text »verloren« und mit einer Wahrscheinlichkeit von 50 Prozent den Text »gewonnen« ergibt.
(Diese Übungsaufgabe ist mit den bisher vorgestellten Sprachelementen lösbar, auch wenn die Lösung für voll ausgebildete Python -Programmierer nicht unbedingt als in gutem Stil programmiert gilt.)
/ Funktionsdefinition *
Definieren Sie unter Zuhilfenahme der Funktion »random« (aus dem Standardmodul »random«) mit »def« eine Funktion »wurf1«, deren mit einer Wahrscheinlichkeit von 75 Prozent den Wert 0 und mit einer Wahrscheinlichkeit von 25 Prozent den Wert 1 ergibt.
Definieren Sie dann Zuhilfenahme dieser Funktion »wurf1« mit »def« ein Funktion »spiel1()«, deren Aufruf mit einer Wahrscheinlichkeit von 75 Prozent den Text »verloren« und mit einer Wahrscheinlichkeit von 25 Prozent den Text »gewonnen« ergibt.
Teilnehmerfrage Wofür braucht man »return«? ⃗
Wenn man Python erlernen will, muß man auch die Bedeutung von »return« erlernen, weil sie zu Python gehört. – Es ist aber nicht gesagt, daß jeder Mensch Python lernen sollte. Insofern kann man nicht sagen, daß das Erlernen der return-Anweisung allgemein (für jeden Menschen) wichtig oder nützlich ist.
Für einen erfahrenen Python -Programmierer ist die Bedeutung der return-Anweisung so offensichtlich, daß die Frage nach ihrer Notwendigkeit für ihn verblüffend ist. Ähnlich wie es für ihn wäre, gefragt zu werden, wofür man Hände braucht.
In den meisten Python -Programme finden sich viele Definitionen von Funktionen. Während der Ausführung eines Programms laufen diese Funktionen und kommunizieren miteinander. Die Rückgabeanweisung erlaubt es einer Funktion, Informationen an die Funktion, die sie aufgerufen hat, zu übermitteln. Die return-Anweisung ermöglicht es also den Funktionen miteinander zu kommunizieren – etwas, ohne das die meisten Python -Programme gar nicht funktionieren könnten.
Eine häufig gestellte Anfängerfrage lautet: „Wie kann ich aus einer Funktion auf eine Variable einer anderen Funktion zugreifen?“. Solche Zugriffe wurden bewußt nicht ermöglicht. Statt dessen kann eine Funktion Informationen für andere Funktionen bereitstellen, indem sie mit einer Rückgabeanweisung zurückgibt. Die return-Anweisung löst insofern ein Problem, auf das viele Programmierer irgendwann einmal stoßen.
In den meisten Python -Programme finden sich viele Definitionen von Funktionen, und in vielen Definitionen von Funktionen findet man Rückgabeanweisungen. Man kann Python -Programme also normalerweise nur richtig verstehen, wenn man auch die Rückgabeanweisung kennt.