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:

black box

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:

black box

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:

black box

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:

black box

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:

black box

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ückabe. Funktionen können - wie oben gezeigt - aber auch gar keine Daten zurückgeben.

Beispiel:

black box

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.

X

Fehler melden

X

Suche