Fachkonzept - Funktion

Funktion als Verarbeitungseinheit

Funktionen kennst du aus der Mathematik: Die Funktion f mit der Funktionsdefinition f(x) = x2 ordnet jeder Zahl (aus einer noch festzulegenden Definitionsmenge) ihr Quadrat zu. Der Funktionsaufruf f(3) liefert dann das Quadrat der Zahl 3.

Die Funktionen A bzw. u mit den Funktionsdefinitionen A(a, b) = a*b und u(a, b) = 2*a+2*b ordnen den Seitenlängen eines Rechtecks den Flächeninhalt bzw. den Umfang des Rechtecks zu. Der Funktionsaufruf A(2, 5) liefert den Flächeninhalt 10 eines Rechtecks mit den Seitenlängen 2 und 5, der Funktionsaufruf u(2, 5) den Umfang 14.

Das Grundschema, das bei allen Funktionsanwendungen zum Tragen kommt, soll am Beispiel der Funktion A verdeutlicht werden:

Black-Box zur Funktion

Die Funktion A ist eine Einheit, die übergebene Daten verarbeitet und einen berechneten Funktionswert zurückgibt. Die Verarbeitung wird durch die Funktionsvorschrift A(a, b) = a*b festgelegt und durch einen Funktionsaufruf wie z.B. A(2, 5) aktiviert.

Entsprechend werden Funktionen in der Informatik benutzt.

Die Funktion anzahlTageImMonat wird durch folgende Funktionsdefinition festgelegt:

def anzahlTageImMonat(monat, jahr):
    if monat in [1, 3, 5, 7, 8, 10, 12]:
        anzahl = 31
    elif monat in [4, 6, 9, 11]:
        anzahl = 30
    elif schaltjahr(jahr):
        anzahl = 29
    else:
        anzahl = 28
    return anzahl

Hierdurch wird eine Verarbeitungseinheit erzeugt, die sich wie folgt verhält:

Black-Box zur Funktion

Ein Funktionsaufruf wie z.B. anzahlTageImMonat(2, 2012) aktiviert die Verarbeitung und liefert als Ergebnis der Verarbeitung den Funktionswert. Dieser Wert kann anschließend weiterverarbeitet werden, z.B. mit einer print-Anweisung: print(anzahlTageImMonat(2, 2012)).

Zusammenfassend lässt sich der Funktionskonzept der Informatik wie folgt beschreiben.

Eine Funktion ist eine Einheit, die übergebene Daten verarbeitet und den berechneten Funktionswert als Ergebnis zurückgibt. Die Verarbeitung wird über eine Funktionsdefinition (man sagt oft auch Funktionsdeklaration) festgelegt. Aktiviert wird eine Verarbeitung durch einen Funktionsaufruf.

Datenübergabe bei Funktionen

Parameter sind Platzhalter, mit deren Hilfe man Daten zur Laufzeit an Funktionen übergeben kann.

In der Definition einer Funktion werden passende formale Parameter eingeführt (das sind die in den Klammern nach dem Namen der Funktion aufgeführten Platzhalter). Diese können dann innerhalb der Definition wie Variablen benutzt werden.

Bei einem Aufruf einer Funktion oder Prozedur müssen die formalen Parameter mit konkreten Werten versehen werden. Diese konkreten Werte nennt man auch aktuelle Parameter. Aktuelle Parameter können konkrete Datenwerte wie Zahlen sein, es sind aber auch auswertbare Terme erlaubt.

Beispiel: Funktionsaufrufe zur Funktion anzahlTageImMonat mit aktuellen Parametern:

anzahlTageImMonat(2, 2009)
anzahlTageImMonat(4, 2009)
anzahlTageImMonat(2, 2012)
anzahlTageImMonat(2, jahr+1)

Das folgende Black-Box-Diagramm verdeutlicht noch einmal die eingeführten Fachbegriffe am Beispiel.

Black-Box zur Funktion

Beachte, dass die Anzahl der Parameter in einer Funktionsdefinition beliebig sein kann. Bei Funktionsaufrufen muss die Anzahl der aktuellen Parameter mit der Anzahl der formalen Parameter übereinstimmen.

Beachte, dass die Anzahl der Parameter in einer Funktionsdefinition beliebig sein kann. Eine Funktionsdefinition kann insbesondere auch gar keine Parameter vorsehen, wie das folgende Beispiel zeigt.

Die Funktion initialisierungDaten liefert einen Funktionswert - hier ein Tupel bestehd aus zwei Daten - ohne dass Werte zur Verarbeitung übergeben worden wären.

def initialisierungDaten():
    datum1 = (21, 1, 1992)
    datum2 = (5, 7, 2009)
    return (datum1, datum2)

Bei einen Funktionsaufruf werden in einem solchen Fall auch keine aktuellen Parameter benutzt.

initialisierungDaten()

Datenrückgabe bei Funktionen

Die Anzahl der Rückgabedaten in einer Funktionsdefinition ist auf maximal 1 beschränkt. Wenn mehrere Daten berechnet werden und zurückgegeben werden sollen, dann müssen sie zu einer komplexeren Dateneinheit zusammengefasst werden. Erst dann können sie als Gesamtpaket zurückgegeben werden.

Die oben gezeigte Funktionsdefinition zur Funktion initialisierungDaten zeigt einen solchen Fall.

def initialisierungDaten():
    datum1 = (21, 1, 1992)
    datum2 = (5, 7, 2009)
    return (datum1, datum2)

Die beiden Daten datum1 und datum2 werden hier zu einem Tupel (datum1, datum2) zusammengefasst, bevor sie zurückgegeben werden.

Funktionen können auch gar keine Daten zurückgeben.

Die folgende Funktion ausgabeDaten verarbeitet übergebene Daten, liefert aber keinen Wert als Ergebnis der Verarbeitung zurück.

def ausgabeDaten(dGeburt, dAktuell, dHalbzeit):
    print("Geburtsdatum:", dGeburt)
    print("aktuelles Datum:", dAktuell)
    print("halb-so-alt-Datum:", dHalbzeit)

Funktionen ohne Rückgaben nennt man auch Prozeduren.

Eine Prozedur ist eine Verarbeitungseinheit, die kein Ergebnis zurückliefert.

Das folgende Beispielprogramm zeigt einen wesentlichen Unterschied bei der Verwendung von Funktionsaufrufen mit und ohne Datenrückgabe.

# Initialisierung
(datumGeburt, datumHeute) = initialisierungDaten()
# Verarbeitung
anzahlTage = anzahlTageZwischenDatum(datumGeburt, datumHeute)
halbeAnzahlTage = anzahlTage // 2
datumHalbzeit = datum(datumGeburt, halbeAnzahlTage)
# Ausgabe
ausgabeDaten(datumGeburt, datumHeute, datumHalbzeit)

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. Im oben gezeigten Beispiel sind die Funktionsaufrufe jeweils in Zuweisungen integriert. Der Funktionsaufruf anzahlTageZwischenDatum(datumGeburt, datumHeute) beispielsweise liefert ein Ergebnis, das über die Zuweisung an die Variable anzahlTage gebunden wird.

Funktionsaufrufe ohne Datenrückgabe (bzw. Prozeduraufrufe) wie der Aufruf ausgabeDaten(datumGeburt, datumAktuell, datumHalbzeit) im Programm oben stellen dagegen eigenständige Anweisungen dar.

Funktion als Unterprogramm

Funktionsdefinitionen können in komplexeren Programmen als Unterprogramme vorkommen. Unterprogramme sind eigenständige Programmeinheiten. Sie werden innerhalb von Programmen benutzt, um Teilaufgaben zu implementieren. Durch die Verwendung von Unterprogrammen werden Quelltexte besser strukturiert. Manchmal kann man mit Hilfe von Unterprogrammen auch Codeduplizierung vermeiden.

Wenn Programme immer umfangreicher werden, wird es immer schwieriger, den Überblick zu bewahren und die Bedeutung aller Anweisungen zu verstehen. Man versucht daher, komplexe und umfangreiche Programme zu strukturieren, indem man sie sinnvoll in Unterprogramme aufteilt.

Beispiel: In zweiten Programm aus Abschnitt Einstieg - Halb so alt findet man schneller die Stelle an der überprüft wird, ob ein Jahr ein Schaltjahr ist.

Wenn eine Lösung zu einer Teilaufgabe mehrfach benötigt wird, dann erspart man sich mit einem geeigneten Unterprogramm Codeduplizierung. Ein in wesentlichen Teilen übereinstimmender Quelltext muss nicht mehrfach hingeschrieben werden, sondern kann einmal als Unterprogramm ausgelagert werden.

Beispiel: Im zweiten Programm aus Abschnitt Einstieg - Halb so alt wird mit Hilfe eines geeigneten Unterprogramms vermieden, das Verfahren zur Bestimmung von Schaltjahren mehrfach zu implementieren.

X

Fehler melden

X

Suche