Routinen mit Rückgabewerten (Funktionen)
Bislang haben wir uns Routinen erstellt, die bestimmte komplizierte Abläufe durchführen, z.B. ein Namensschild zeichnen und die dann einen eigenen Namen haben. Manchmal werden solche Routinen, die einfach etwas tun, auch als Prozeduren bezeichnet.
Daneben kann es auch sinnvoll sein, Routinen zu erstellen, die (mehr oder weniger) komplizierte Berechnungen anstellen und einen eigenen Namen haben. Diese Routinen tun nicht einfach nur etwas, sondern müssen den Wert der Berechnung zurückgeben. Das tut sie, indem sie sich letztlich ähnlich wie eine Variable verhält, die ja auch einen Variablen-Wert hat. Eine solche Routine wird als Funktion bezeichnet, den Wert, den sie zurückliefert, als Funktionswert.
Eine in Python bereits eingebaute Funktion hast Du schon kennen
gelernt, nämlich die Funktion len(...)
. Sie hat die
Anzahl der Zeichen in einer Zeichenkette berechnet, die zwischen den
Klammern eingegeben war.
In unserem Namensschild-Beispiel haben wir eine schon gar nicht mehr so einfache Berechnung, nämlich die Berechnung der Breite eines Textes. Diese musste zunächst die Anzahl der Zeichen bestimmen und dann aus dieser Anzahl der Zeichen die tatsächliche Breite auf der Schildkröten-Zeichenfläche.
Im folgenden Programm wird diese Berechnung in eine selbstgemachte Funktion mit einem
eigenen Namen gepackt, nämlich berechnebreite(...)
. In
die Klammern hinter dem Namen wird der Text eingesetzt. Die Funktion
liefert einen Wert zurück, der in dem Programm dann der (globalen) Variable
breite
zugwiesen wird.
In der Funktion berechnebreite(...)
findet sich in der
letzten Zeile der Befehl return
gefolgt von einer
mathematischen Formel. Diese Zeile sagt, welchen Wert die Funktion nach
dem Ausführen zurückliefern soll. Es ist genau der Wert, den die
mathematische Formel annimmt. In unserem Beispiel ist das gerade der Wert
30 zuzüglich dem 18-Fachen der Anzahl der Buchstaben.
Für den Anfang empfiehlt es sich, tatsächlich nur einen einzigen
return
-Befehl pro Funktion zu verwenden; mehrere davon
können leicht zur Verwirrung führen.
Aufgabe 1: Werte zu Testzwecken ausgeben
berechnebreite(...)
so, dass zu Testzwecken
sowohl die Anzahl der Buchstaben als auch die berechnete Breite mit
print
ausgegeben werden.
Aufgabe 2: Funktionen in Informatik und Mathematik
Vielleicht hast du bei dem Namen "Funktion" direkt an den Mathematik-Unterricht gedacht, wo man ja auch den Begriff "Funktion" kennt. Im Mathematik-Unterricht funktionieren Funktionen aber in der Regel nur mit Zahlen (und nicht etwa mit Zeichenketten).
(Bemerkung: Im Mathematikunterricht heißen Funktionen meistens "f", "g", "h" usw. In der Informatik verwendet man meistens längere Namen, aber das ist ein bisschen eine Frage der "Kultur" in der jeweiligen Wissenschaft.)
Solche rein mathematischen Funktionen kann man in Python natürlich
auch konstruieren. Angenommen, es gibt die mathematische Funktion
\begin{equation}
f(x)=3 \cdot x + 5
\end{equation}
Erstelle eine Funktion f(x)
in Python. Entwirf ein
Programm, bei der man den x-Wert eingeben kann und der y-Wert mit
print(...)
ausgegeben wird.
Aufgabe 3: Breite bei verschiedenen Schriftgrößen
Die Funktion berechnebreite(text)
in unserem Namensschild-Beispiel hatte
einen einzigen Parameter, nämlich den Text, dessen Breite berechnet werden
sollte. Während (zumindest in der Mittelstufe) Funktionen im
Mathematikunterricht nur einen Funktionsparameter haben, können Funktionen in
der Informatik mehrere Funktionsparameter haben.
Zum Beispiel hängt die Breite eines Textes natürlich nicht nur von
der Länge des Textes ab, sondern auch von der Schriftgröße.
Erweitere die Funktion berechnebreite
, dass sie zwei
Parameter hat, nämlich
berechnebreite(text,schriftgroesse)
. Passe die Berechnung
in der Funktion an.
Teste diese angepasste Funktion in einem Programm, bei dem der Benutzer die Schriftgröße eingeben kann.
Exkurs: Rückgabe mehrerer Werte
In einem Abschnitt weiter vorne haben wir das folgende Programm betrachtet, das jedoch wegen des Sicherheitsmechanismus nicht funktionierte, der verhindert, dass Routinen globale Variablen ändern.
Bei einem einzelnen Wert haben wir schon gesehen, wie eine Funktion diesen an das Hauptprogramm zurückgeben kann. Mit einem Trick kann man aber auch mehrere Werte gleichzeitig übergeben. Hierfür gibt man quasi ein "Päckchen" mit mehreren Werten zurück, in unserem Fall die vier eingelesenen Wertex1
, y1
,
x2
, y2
.