Zu Rückgaben in Python (Zu Rückgaben in Python), Lektion, Seite 724061
https://www.purl.org/stefan_ram/pub/zu_rueckgaben_python (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram
Python-Kurs

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 o

p( 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():
8

f()

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 8

f()

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:

Darstellung der Faulheit von Vergleichen ⃗

Protokoll

def f():
print( "f" )
return 4

8 < 6 < f()

False

Darstellung der Faulheit von »and« ⃗

Konsolenprotokoll

def t():
print( "t" )
return True

def f():
print( "f" )
return False

f() and f()

f
False
f() and t()
f
False
t() and f()
t
f
False
t() and t()
t
t
True

Darstellung der Faulheit von »or« ⃗

Konsolenprotokoll

def t():
print( "t" )
return True

def f():
print( "f" )
return False

f() or f()

f
f
False
f() or t()
f
t
False
t() or f()
t
True
t() or t()
t
True

Rückgabe von »None« ⃗

Der Wert »None« wird von der Konsole nicht ausgegeben.

Protokoll

def f():
return None

f()

(keine Ausgabe)

Die Anweisung »return« hat dieselbe Bedeutung wie die Anweisung »return None«.

Protokoll

def f():
return

f()

(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():
pass

print( '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 random

print( '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 4

print( 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 4

print( 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 10

print( 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 2

print( f() + f() )

?   Übungsfrage 13

Welche Ausgabe ergibt die Ausführung des folgenden Skripts?

Skript

def f():
print( 13 )
return 2

print( 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 3

x = 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.

 

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram724061 stefan_ram:724061 Zu Rückgaben in Python Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd724061, slrprddef724061, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/zu_rueckgaben_python