Exkurs - Datenverarbeitung mit Funktionen
Übergabe - Verarbeitung - Rückgabe
Eine Funktion ist eine Verarbeitungseinheit, die übergebene Daten verarbeitet und den berechneten Funktionswert als Ergebnis zurückgibt.
Beispiel:
Funktionsdefinition:
def zahlToMonat(zahl):
# zahl: Zahl aus dem Bereich 1..12
# return: Zeichenkette
if zahl == 1:
monatsname = 'Januar'
elif zahl == 2:
monatsname = 'Februar'
elif zahl == 3:
monatsname = 'Maerz'
elif zahl == 4:
monatsname = 'April'
elif zahl == 5:
monatsname = 'Mai'
elif zahl == 6:
monatsname = 'Juni'
elif zahl == 7:
monatsname = 'Juli'
elif zahl == 8:
monatsname = 'August'
elif zahl == 9:
monatsname = 'September'
elif zahl == 10:
monatsname = 'Oktober'
elif zahl == 11:
monatsname = 'November'
elif zahl == 12:
monatsname = 'Dezember'
return monatsname
Funktionsaufruf:
>>> zahlToMonat(7)
'Juli'
Aufgabe 1
Ergänze die Verarbeitungsvorschrift (Funktionsdefinition) so, dass eine leere Zeichenkette zurückgegeben wird, wenn eine Zahl, die keinen Monat darstellt, übergeben wird.
Mehrere Übergabedaten möglich
Bei einer Funktion können mehrere Daten zur Verarbeitung übergeben werden.
Beispiel:
Funktionsdefinition:
def datum(tag, monat, jahr):
# tag: Zahl aus dem Bereich 1..31
# monat: Zahl aus 1..12
# jahr: positive natürliche Zahl
# return: Tupel mit 3 Zahlen
return (tag, monat, jahr)
Funktionsaufruf:
>>> datum(3, 3, 2013)
(3, 3, 2013)
Aufgabe 2
Woran erkennt man in der Funktionsdefinition / im Funktionsaufruf, dass hier mehrere Daten zur Verarbeitung übergeben werden?
Komplexe Übergabedaten möglich
Bei einer Funktion können auch komplexe Daten zur Verarbeitung übergeben werden.
Beispiel:
Funktionsdefinition:
def zahlToMonat(zahl):
# ... s.o.
def datumAlsZeichenkette(datum):
# datum: Tupel mit 3 Zahlen zur Datumbeschreibung
# return: Zeichenkette
zeichenkette = str(datum[0]) + '. ' + zahlToMonat(datum[1]) + ' ' + str(datum[2])
return zeichenkette
Funktionsaufruf:
>>> datumAlsZeichenkette((25, 1, 2012))
'25. Januar 2012'
Aufgabe 3
Warum muss beim Funktionsaufruf hier eine "doppelte" Klammer stehen? Was geschieht, wenn man nur eine "einfache" Klammerung hier vornimmt?
Keine Übergabedaten möglich
Es ist auch erlaubt, dass keine Daten zur Verarbeitung übergeben werden.
Beispiel:
Funktionsdefinition:
def meinGeburtstag():
# return: Tupel mit 3 Zahlen
return (16, 6, 1996)
Funktionsaufruf:
>>> meinGeburtstag()
(16, 6, 1996)
Aufgabe 4
Darf man die Klammern beim Funktionsaufruf weglassen? Probiere aus, was dann ausgegeben wird.
Komplexe Rückgabedaten
Bei einer Funktion kann immer nur ein Funktionswert zurückgegeben werden. Wenn man mehrere Daten zurückgeben möchte, dann muss man sie mit geeigneten Datenstrukturen zu einer komplexeren Dateneinheit zusammenfassen.
Beispiel:
Funktionsdefinition:
def feiertage(jahr):
# jahr: positive natürliche Zahl
# return: Liste mit Tupeln
if jahr == 2012:
ostern = (8, 4, 2012)
pfingsten = (27, 5, 2012)
weihnachten = (25, 12, 2012)
elif jahr == 2013:
ostern = (31, 3, 2013)
pfingsten = (19, 5, 2013)
weihnachten = (25, 12, 2013)
# ...
return [ostern, pfingsten, weihnachten]
Funktionsaufruf:
>>> feiertage(2012)
[(8, 4, 2012), (27, 5, 2012), (25, 12, 2012)]
Aufgabe 5
Welche Datenstruktur wird hier zur Bündelung der Rückgabedaten benutzt? Könnte man auch eine andere Datenstruktur benutzen?
Keine Rückgabedaten
In der Regel erzeugen Funktionen genau eine Rückgabe. Funktionen können - wie oben gezeigt - aber auch gar keine Daten zurückgeben.
Beispiel:
Funktionsdefinition:
def zahlToMonat(zahl):
# ... s.o.
def datumAlsZeichenkette(datum):
# ... s.o.
def printDatumAlsZeichenkette(datum):
# datum: Tupel mit 3 Zahlen zur Datumbeschreibung
print(datumAlsZeichenkette(datum))
Funktionsaufruf:
>>> datumAlsZeichenkette((25, 1, 2012))
'25. Januar 2012'
>>> printDatumAlsZeichenkette((25, 1, 2012))
25. Januar 2012
Aufgabe 6
(a) Siehst du den Unterschied bei der Auswertung der beiden Funktionsaufrufe?
Funktionen mit und ohne Rückgaben
Eine Prozedur ist eine Funktion, die kein Ergebnis zurückliefert.
Wir schauen uns jetzt den Unterschied zwischen Funktionen mit Rückgaben und Prozeduren (d.h. Funktionen ohne Rückgaben) genauer an. Hierzu betrachten wird die folgenden Demoprogramme.
Programm 1:
# Funktionsdefinitionen
def datumAlsZeichenkette(datum):
# datum: Tupel mit 3 Zahlen zur Datumbeschreibung
# return: Zeichenkette
zeichenkette = str(datum[0]) + '.' + str(datum[1]) + '.' + str(datum[2])
return zeichenkette
# Testprogramm
aktuellesDatum = (16, 1, 2012)
datumAlsZeichenkette(aktuellesDatum)
Ausführung des Programms:
>>>
Die Funktion datumAlsZeichenkette
ist eine Funktion mit Rückgabe.
Im Testprogramm wird diese Funktion aufgerufen.
Im Ausführfenster wird der zurückgegebene Wert aber nicht angezeigt.
Programm 2:
# Funktionsdefinitionen
def datumAlsZeichenkette(datum):
# datum: Tupel mit 3 Zahlen zur Datumbeschreibung
# return: Zeichenkette
zeichenkette = str(datum[0]) + '.' + str(datum[1]) + '.' + str(datum[2])
return zeichenkette
# Testprogramm
aktuellesDatum = (16, 1, 2012)
aktuellesDatumAlsZeichenkette = datumAlsZeichenkette(aktuellesDatum)
print(aktuellesDatumAlsZeichenkette)
Ausführung des Programms:
>>>
16.1.2012
Auch in diesem Testprogramm wird die Funktion datumAlsZeichenkette
aufgerufen.
Hier ist der Funktionsaufruf aber Teil einer Zuweisung. Der von der Funktion zurückgegebene
Wert wird hier einer Variablen zugewiesen. Mit einer print
-Anweisung wird dieser
Wert dann im Ausführfenster ausgegeben.
Programm 3:
# Funktionsdefinitionen
def datumAlsZeichenkette(datum):
# datum: Tupel mit 3 Zahlen zur Datumbeschreibung
# return: Zeichenkette
zeichenkette = str(datum[0]) + '.' + str(datum[1]) + '.' + str(datum[2])
return zeichenkette
def printDatumAlsZeichenkette(datum):
# datum: Tupel mit 3 Zahlen zur Datumbeschreibung
print(datumAlsZeichenkette(datum))
# Testprogramm
aktuellesDatum = (16, 1, 2012)
printDatumAlsZeichenkette(aktuellesDatum)
Ausführung des Programms:
>>>
16.1.2012
Im Testprogramm wird hier die Prozedur printDatumAlsZeichenkette
aufgerufen.
Diese Prozedur liefert keine Rückgabedaten. Stattdessen enthält sie eine print
-Anweisung,
mit der eine Zeichenkette im Ausführfenster ausgegeben wird.
Beachte, dass ein Funktionsaufruf mit Datenrückgabe keine eigenständige Anweisung darstellt. Innerhalb eines Programms muss bei einem solchen Funktionsaufruf immer die weitere Verarbeitung des Rückgabewerts festgelegt werden.
Funktionsaufrufe ohne Datenrückgabe (bzw. Prozeduraufrufe) stellen dagegen eigenständige Anweisungen dar.