Inhaltsverzeichnis

Funktionen

Komplexe Programme können mit Hilfe von Funktionen in kleinere, leichter zu programmierende Teilprogramme zerlegt werden. Solche Teilprogramme können zudem mehrmals verwendet werden.

Definition

Eine Funktion ist immer wie folgt aufgebaut:

def name_der_funktion(PARAMETER):  # Parameter sind optional
    # CODE DER FUNKTION
    return RETURN_WERT  # optional

Nachdem du eine Funktion definiert hast, kannst du sie ganz einfach aufrufen. Dazu mehr in den Beispielen unten.

Übrigens hast du schon viele Funktionen kennengelernt - ohne dass du es wahrscheinlich gemerkt hast. Zum Beispiel ist die Funktion print() für Turtles eine Funktion, die die Parameter ausgibt. Diese Funktion wurde vorprogrammiert. Nun wollen wir schauen, wie wir unsere eigenen Funktionen definieren können.

Funktionen ohne Rückgabewert

In diesem Unterkapitel schauen wir Funktionen ohne Rückgabewert an, also Funktionen ohne das return-Statement am Ende.

Beispiel: Du möchtest das gleiche Quadrat mehrfach zeichnen. Dies kannst du wie folgt machen:

from turtle import *
 
fritz = Turtle()
fritz.hideturtle()
 
# Quadrat 1
fritz.setpos(-130,0)
repeat 4:
    fritz.forward(100)
    fritz.left(90)
 
# Quadrat 2
fritz.setpos(0,0)
repeat 4:
    fritz.forward(100)
    fritz.left(90)

Es fällt auf, das hier zweimal der identische Code vorkommt:

repeat 4:
    fritz.forward(100)
    fritz.left(90)

Dies ist nicht sehr elegant. Wenn man nun das gleiche Quadrat zehnmal zeichnen möchte, wird es noch viel schlimmer! Es lohnt sich deshalb hier, eine Funktion quadrat zu definieren und diese dann mehrfach aufzurufen:

from turtle import *
 
fritz = Turtle()
fritz.hideturtle()
 
def quadrat():
    repeat 4:
        fritz.forward(100)
        fritz.left(90)
 
# Quadrat 1
fritz.setpos(-130,0)
quadrat()
 
# Quadrat 2
fritz.setpos(0,0)
quadrat()

Beachte, dass in obigem Code jeweils zuerst die Position der Turtle festgelegt wird, bevor die Funktion aufgerufen wird. Noch eleganter wäre es, wenn das Setzen der Position in der Funktion geschieht. Die Koordinaten könnten dann der Funktion als Argument übergeben werden:

from turtle import *
 
fritz = Turtle()
fritz.hideturtle()
 
def quadrat(x,y):
    fritz.setpos(x,y)
    repeat 4:
        fritz.forward(100)
        fritz.left(90)
 
# Quadrat 1
quadrat(-130,0)
 
# Quadrat 2
quadrat(0,0)

Du kannst der Funktion auch noch weitere Argumente übergeben, zum Beispiel um die Grösse des Quadrats und dessen Farbe anzugeben:

from turtle import *
 
fritz = Turtle()
fritz.hideturtle()
 
def quadrat(x,y,seite,farbe):
    fritz.setpos(x,y)
    fritz.pencolor(farbe)
    repeat 4:
        fritz.forward(seite)
        fritz.left(90)
 
# Quadrat 1
quadrat(-130,0,70,"red")
 
# Quadrat 2
quadrat(0,0,100,"magenta")

Funktionen mit Rückgabewert

Funktionen bieten sich auch an, wenn man mehrfach die gleiche Rechnung, einfach mit verschiedenen Werten, ausführen möchte. Allerdings möchte man dann, dass die Funktion einem das Resultat als Rückgabewert zurück gibt.

Beispiel: Wir wollen eine Funktion definieren, die uns das Volumen eines Quaders zurück gibt. Falls der Quader die Seitenlängen $a,b$ und $c$ hat, so ist sein Volumen $$V = a \cdot b \cdot c$$ Die zugehörige Funktion ist dann:

quader.py
def quader(a,b,c):
    resultat = a*b*c
    return resultat
 
print(quader(4,3,2))

Auf der letzten Zeile wird das Volumen für einen Quader mit Seitenlängen $4, 3$ und $2$ berechnet und dann in der Konsole ausgegeben.

Probleme mit Funktionen

Probleme mit Funktionen

Aufgaben G – Funktionen ohne/mit Rückgabewert

Aufgabe G1

Für diese Aufgabe benötigst du Turtle graphics.

Aufgabe G2

Aufgabe G3

Aufgabe G4

Für diese Aufgabe benötigst du Turtle graphics. Definiere folgende Funktionen:

Ruft man z.B. die Funktion dreieck(michelangelo, 100, "red", -200, 50) auf, soll die Turtle namens michelangelo ein rotes Dreieck mit Seitenlänge 100 und Startpunkt (-200,50) zeichnen. Wichtig: Die Turtle muss zuerst erstellt werden (z.B.: michelangelo = Turtle()), damit sie der Funktion übergeben werden kann.

Zeichne mit diesen Funktionen ein Bild. Jede der drei Formen soll mindestens 3 mal vorkommen. Variiere die Farbe und Grösse der Formen.

Erweiterung (Optional)

Erstelle ein Python Modul:

Lösung

Aufgabe G5

Kennt man in einem rechtwinkligen Dreieck die beiden Katheten, so kann man mit dem Satz von Pythagoras die Hypothenuse bestimmen. Definiere eine Funktion mit Namen pythagoras. Als Argumente soll man die beiden Katheten eines rechtwinkligen Dreiecks eingeben. Die Funktion berechnet dann die Hypothenuse und gibt diese mit return zurück.

Tipp: Die Wurzel einer Zahl ziehst du mit sqrt(x), dazu musst du aber zuerst das math-Modul importieren: import math.

Kontrolle: Für die Katheten 3 und 4 ist die Hypothenuse 5. Die Codezeile print(pythagoras(3,4)) soll dann also 5.0 ausgeben.

Lösung

Aufgabe G6

Das Volumen einer Kugel mit Radius $R$ ist: $$V = \frac{4\pi}{3}\cdot R^3$$ Definiere eine Funktion kugel, der man als Argument den Radius übergibt und die dann das Volumen zurückgibt. Die Kreiszahl Pi ($\pi$) kannst du mit math.pi aufrufen, dazu muss aber auch wieder zuerst das math-Modul importiert werden (import math).

Lösung

Aufgabe G7

Definiere eine Funktion wuerfel, welche einen Würfel simuliert, d.h. eine Zufallszahl zwischen 1 und 6 mit return zurückgibt.

Lösung

Challenge (optional)

Simuliere mit TurtleGraphics einen Würfel.

Aufgaben GA – Funktionen mit Algorithmen (ohne/mit Rückgabewert)

Aufgabe GA1 – Fibonacci-Zahlen

Schreibe eine Funkton namens fibonacci_numbers, die beliebig viele Elemente der Fibonacci-Folge ausgibt.

Zum Beispiel soll fibonacci_numbers(8) die ersten acht Elemente der Fibonacci-Folge ausgeben, also 0, 1, 1, 2, 3, 5, 8, 13. Teste die Funktion, indem du sie mit unterschiedlichen Werten aufrufst.

Tipp: Setze in der Funktion zuerst zwei Variablen a und b auf die ersten beiden Fibonacci-Zahlen (0 und 1) und gebe diese nacheinander aus. Erst jetzt beginnt eine sich wiederholende Abfolge von Code-Zeilen für die Ausgabe der weiteren Werte.

Lösung

Aufgabe GA2 – Fibonacci-Muster

Schreibe eine Funkton namens fibonacci_arcs, die eine Spirale aus Viertel-Kreisen zeichnet, deren Radien gemäss der Fibonacci-Folge zunehmen.

Zum Beispiel soll fibonacci_arcs(8) acht Viertelkreise zeichnen. Beachte Folgendes:

Teste die Funktion: fibonacci_arcs(9) sollte etwa folgendes Muster ergeben:

Lösung

Aufgabe GA3 – Fibonacci-Muster mit Zeitmessung

Erweitere die Funktion fibonacci_arcs so, dass sie die Zeit zum Zeichnen des Musters misst und diesen Wert zurückgibt. Importiere dazu das time-Modul (import time) und nutze die Funktion time(), um einen Zeitstempel in Sekunden zu erhalten:

import time
time1 = time.time()
## some code that takes some time
## ...
time2 = time.time()
time_passed = time2 - time1

Teste die Funktion zum Beispiel so:

print(fibonacci_arcs(9))

Damit sollte dein Code das Muster aus neun Viertelkreisen zeichnen und anschliessend die gemessene Anzahl Sekunden ausgeben.

Lösung

Aufgabe GA4

Schreibe eine Funktion summe_ungerade, die die Summe aller ungeraden Zahlen von 0 bis n zurückgibt. Zum Beispiel soll summe_ungerade(5) die Zahl 9 zurückgeben. Auch summe_ungerade(6) soll natürlich 9 zurückgeben.

Tipp: Verwende eine Zählvariable und eine While-Schleife.

Lösung

Aufgabe GA5 (Herausforderung)

Die Fakultät ist eine Funktion, welche jeder ganzen natürlichen Zahl das Produkt aller natürlichen Zahlen (ohne Null) kleiner und gleich dieser Zahl zuordnet. Sie wird mit einem Ausrufezeichen geschrieben. Als Beispiel: $5!=1 \cdot 2 \cdot 3 \cdot 4 \cdot 5 =120$.

Schreibe eine Funktion fakultaet, welcher als Argument eine ganze Zahl übergeben wird und welche dir dann die Fakultät dieser Zahl zurückgibt.

Grosse Herausforderung: Kannst du die Fakultät ganz ohne Schleife berechnen? Dann hast du das Prinzip der Rekursion (Selbst-Aufruf) entdeckt!

Lösung

Aufgabe GA6 (optional)

In dieser Zusatzaufgabe wird der euklidische Algorithmus benutzt, um den ggT von zwei Zahlen zu berechnen.

Schreibe zwei Funktionen ggt und kgv, welche als Argumente zwei Zahlen nehmen und daraus den grössten gemeinsamen Teiler bzw. das kleinste gemeinsame Vielfache berechnen. Das kGV zweier Zahlen erhältst du, indem du das Produkt dieser Zahlen durch den ggT der beiden Zahlen teilst. Es lohnt sich also, zuerst die Funktion ggt zu definieren, damit diese dann in der Definition der Funktion kgv aufgerufen werden kann.

Wenn du das gemacht hast: Erstelle eine weitere Funktion ggt_kgv, welche als Argument zusätzlich einen String mit „ggt“, bzw. „kgv“ entgegennimmt und dann entweder den ggT bzw. das kgV ausgibt.

Lösung