deutsch     english     français     Drucken

 

3.4 FUNKTIONEN MIT RÜCKGABEWERT

 

 

EINFÜHRUNG

  Du weisst bereits, wie man eine Funktion mit oder ohne Parameter definiert und sie aufruft. Aus der Mathematik weisst du wahrscheinlich, dass dort Funktionen etwas anders verstanden werden. Eine Funktion y = f(x) hat in der Mathe eine unabhängige Variable x. Zu jedem Wert von x liefert die Funktion einen Wert der abhängigen Variablen y. Ein Beispiel ist die quadratische Funktion  y = x2.
Für x = 0, 1, 2, 3 ergeben sich die Quadratzahlen 0, 1, 4, 9.

Auch in Python kann man Funktionen definieren, die einen Wert berechnen und diesen wie eine Variable "zurückgeben".

PROGRAMMIERKONZEPTE: Rückgabewert einer Funktion, Diskretisierung

 

 

DAS SCHLÜSSELWORT RETURN

 

Du kannst eine Funktion squarenumber(a) definieren, die wie in der Mathematik zu einem Wert des Parameters a die Quadratzahl a * a berechnet und sie zurück gibt. Die Rückgabe erfolgt mit dem Schlüsselwort return. In einem GPanel zeichnest du  dann den Funktionsgraf. In der Grafik verwendest du am einfachsten draw(x, y), das eine Strecke von der letzten Position des Grafikcursors zu (x, y)  zeichnet und den Grafikcursor auf (x, y) setzt. Nach Erscheinen des GPanel-Fenster steht der Grafikcusor bei (0, 0). Du musst ihn zuerst mit move() an den Startpunkt der Grafik setzen, sonst siehst du eine fehlerhafte Anfangslinie.

 

 
from gpanel import *
makeGPanel(-25, 25, -25, 25)

def squarenumber(a):
    b = a * a
    return b

for x in range(-5, 6):
    y = squarenumber(x)
    if x == -5:
        move(x, y)
    else:
        draw(x, y)
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MEMO

 

Mit return gibt eine Funktion einen Wert an den Aufrufer zurück und hört mit der weiteren Abarbeitung auf. Eine Funktion kann wie in der Mathematik nicht mehrere  Werte zurückgeben [mehr... Üblicherweise ist return die letzte Anweisung im Funktionsblock.
Dies ist aber nicht zwingend. Wird return vorher aufgerufen, so kehrt die Funktion
an dieser Stelle zurück und die nächsten Anweisungen werden nicht mehr ausgeführt.
].

Wie du gesehen hast, gibt es aber im Gegensatz zur Mathematik in der Informatik auch Funktionen, die keinen Wert zurückgeben, aber doch etwas bewirken. Funktionen können sogar beides tun, etwas bewirken und etwas zurückgeben [mehr... Beim Aufruf einer solchen Funktion muss der zurückgegebene Wert nicht "abgeholt"
werden, man kann daher auch eine Funktion mit Rückgabewert wie einen Befehl verwenden
].

Diese graphische Darstellung der Quadratfunktion ist noch nicht sehr schön. Neben dem fehlenden Koordinatensystem fällt auch der "eckige" Verlauf unangenehm auf, der darauf zurückzuführen ist, dass du die Funktion nur an wenigen ganzzahligen Stützpunkten berechnest, die du mit Geradenstücken verbindest. Hier zeigt sich eine wesentliche Schwäche der Informatik gegenüber der Mathematik:  Obschon die Funktion für jeden Wert der x-Achse (für jede reelle Zahl) einen y-Wert liefert, können wir sie in der Informatik nur an endlich vielen Punkten berechnen. Wir sprechen davon, dass die kontinuierliche x-Achse in diskrete Punkte aufgelöst wird.

 

 

DEZIMALZAHLEN (FLOATS)

 

Immerhin können wir die Darstellung etwas schöner machen, wenn wir die Berechnungspunkte auf der x-Achse eng nebeneinander wählen. Du kannst beispielsweise den Bereich -5 bis 5 in Hundertstel-Schritten durchlaufen. Als weitere Verbesserung zeichnest du noch ein Koordinatengitter ein.

Leider kannst du in Python eine for-Schleife nur mit ganzzahligen Werten durchlaufen.  Brauchst du eine feinere Auflösung, so benötigst du eine while-Schleife. Dabei wird zur x-Koordinate bei jedem Schritt 0.01 dazu addiert. Python fasst x nun nicht mehr als ganze Zahl, sondern als Dezimalzahl (float) auf.

 


from gpanel import *
makeGPanel(-6, 6, -3, 33)
setColor("gray")
drawGrid(-5, 5, 0, 30)

def squarenumber(a):
    b = a * a
    return b

setColor("blue")
lineWidth(2)
x  = -5
while x < 5:
    y = squarenumber(x)
    if x == -5:
        move(x, y)
    else:
        draw(x, y)
    x = x + 0.01
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

 

 

MEMO

 

In Python werden Dezimalzahlen float genannt. Im Unterschied zu den Dezimalzahlen in der Mathematik haben sie in der Informatik allerdings  immer eine bestimmte (endliche) Ziffernzahl. In Python sind es rund 14 Ziffern (solche Zahlen werden in anderen Programmiersprachen double genannt.) Man kann in einem Computerprogramm beispielsweise die Zahl  π, die ja ein unendlicher Dezimalbruch ist, nie genau angeben, sondern nur mit einem float auf rund 14 Ziffern genau.

Falls du ein Koordinatengitter brauchst, so gehst du wie folgt vor:

  • Du vergrösserst den Koordinatenbereich links und rechts, sowie oben und unten um 10% (statt -5 bis 5 nimmst du -6 bis 6, statt 0 bis 30 nimmst du -3 bis 33)
  • Du rufst drawGrid() mit 4 Parameterwerten auf, die dem tatsächlich verwendeten Koordinatenbereich entsprechen. Dabei entstehen 10 Koordinatenfelder.

 

 

AUFGABEN

 
1.

Definiere die Funktion mean(a, b), welche das arithmetische Mittel der zwei Parameterwerte zurückgibt. Teste sie mit der Console aus.


2.


Untersuche das Verhalten der Funktion y = cos(x). Wie unterscheidet sie sich von y = sin(x).


3.


Stelle in einem GPanel den Graf der Funktion y = sin(5x) im Bereich 0 bis 2π mit einer Auflösung 0.01 dar ( π kannst du mit math.pi erhalten).
Nehme in der Sinusfunktion statt 5 einen anderen Wert. Welchen Zusammenhang gibt es zwischen dieser Zahl und dem Graf?


4.


Definiere die Funktion f(x) = 1 / sin(x) und stelle sie mit GPanel im Bereich -5 .... 5 (für beide Achsen) mit einer Auflösung von 0.001 dar. Zeichne mit einer anderen Farbe auch die Koordinatenachsen ein. Was stellst du Interessantes fest?