Skip to content

Funktionen

Programmieren

Durch das Definieren von Funktionen (auch Unterprogramme genannt) und dem mehrmaligen Aufruf dieser, vermeidet man, dass Code doppelt geschrieben werden muss.

Lerne etwas neues …
mache es …

Syntax

Definition

Zeile 1
Eine Unterprogramm beginnt mit dem Schlüsselwort def (für definition)
Anschliessend folgt der Name für das Unterprogramm. Dieser kann wie bei den Variablennamen mehr oder weniger frei gewählt werden
Dann kommen die Argumente in einer runden Klammer
Die Definition wird mit einem Doppelpunkt abgeschlossen
python
def name(args, kwargs):
	do1
	do2
	...
	return x
Zeilen 2-4
Der Inhalt des Unterprogramms
Hier ist beliebiger Code möglich
alles was zum Unterprogramm gehört, muss um eine Ebene (3 Leerzeichen oder 1 Tab) eingerückt werden
Letzte Zeile
Das Unterprogramm wird mit der return-Anweisung abgeschlossen und kann einen Wert zurückgeben

Aufruf

Ein Unterprogramm rufen wir mit dessen Namen und einer runden Klammer auf. In die runde Klammer kommen die Argumente. Wenn es keine Argumente hat, steht dort eine leere runde Klammer.

python
z = name(args, kwargs)

Der Aufruf eines Unterprogramms wird wie ein Ausdruck ausgewertet. Das Ergebnis (der Rückgabewert) kann wie bei einem Ausdruck einer Variablen zugewiesen oder direkt in einem Ausdruck weiterverwendet werden.

Argumente

args
Einem Unterprogramm können Argumente (arguments) übergeben werden. Dadurch kann ein Unterprogramm mit variablen Eingaben eine Klasse von Problemen lösen.
kwargs
Eine Spezialität von Python sind sogenannte keyword arguments. Es handelt sich um benannte Argumente. Der Vorteil: Weil sie benannt sind, können sie in beliebiger Reihenfolge stehen und dank eines Default-Wertes können sie auch weggelassen werden.

Beispiel

python
def hallo(vorname, nachname, anrede, duzen=True):
    if duzen:
        print("Hallo", vorname)
    else:
        print("Guten Morgen", anrede, nachname)

hallo("Donald", "Duck", "Herr")
hallo("Donald", "Duck", "Herr", False)
hallo("Donald", "Duck", "Herr", True)

Aufgabe: Beispiel

Führe das Beispiel aus:

  • Was geschieht?
  • Was sind keyword arguments
Lösung: Beispiel

Der Output ist wie folgt:

Hallo Donald
Guten Morgen Herr Duck
Hallo Donald

Das Argument duzen hat beim ersten und letzten Funktionsaufruf den Wert True - beim ersten Aufruf über den Standard-Wert der Funktionsdefinition, beim zweiten Aufruf direkt gesetzt. Deshalb wird das erste print ausgeführt.

Beim mittleren Aufruf wird duzen explizit auf False gesetzt und somit das zweite print ausgeführt.

Aufgaben

Aufgabe: Pythagoras

Von Pythagoras kennen wir die Formel

a2+b2=c2

Dabei stehen a und b für die Längen der Katheten und c für die Länge der Hypotenuse eines rechtwinkligen Dreiecks:

Wir können also bei 2 gegebenen Seitenlängen die Länge der dritten Seite berechnen.

Wir definieren eine einfache Funktion die bei bekannten Katheten die Hypothenuse berechnet:

python
import math

def hypotenuse(a, b):
    c = math.sqrt(a**2 + b**2)
    return c

print(hypotenuse(3,4))

Wir versuchen das nun mit keyword arguments:

python
import math

def pythagoras(a=0, b=0, c=0):
    if c == 0:
        return math.sqrt(a**2 + b**2)

print(pythagoras(a=3,b=4))
  1. Erweitere die Funkion pythagoras, so dass aus Hypothenuse c und einer Kathete (a oder b) die andere Kathete berechnet werden kann.
python
print(pythagoras(c=5,b=4))
print(pythagoras(a=3,c=5))
  1. Was geschieht bei den folgenden Aufrufen?
  2. Wie könnten wir die Funktion im Hinblick auf diese Fälle besser programmieren?
python
print(pythagoras(a=3,b=4,c=5))
print(pythagoras(a=3))
print(pythagoras())
Lösung: Pythagoras
  1. Wir müssen die zwei weiteren Fälle mit if korrekt abhandeln:
python
import math

def pythagoras(a=0, b=0, c=0):
    if c == 0:
        return math.sqrt(a**2 + b**2)
    if a == 0:
        return math.sqrt(c**2 - b**2)
    if b == 0:
        return math.sqrt(c**2 - a**2)

print(pythagoras(a=3,b=4))
print(pythagoras(c=5,b=4))
print(pythagoras(a=3,c=5))
  1. Die machen keinen Sinn – wir brauchen genau zwei Seiten des rechtwinkligen Dreiecks! Unsere Programm liefert aber trotzdem Werte zurück. Dies sollten wir nicht tun, da ja nicht klar ist, was diese Werte bedeuten.

  2. Wir müssten die ungültigen Aufrufe abfangen. Dies machen wir am Besten als erstes in der Funktion, bevor wir etwas berechnen, das keinen Sinn macht:
    Im Beispiel überprüfe ich, dass mindestens eine Seite 0 ist und dass mindestens zwei Seiten grösser als 0 sind.

python
import math

def pythagoras(a=0, b=0, c=0):
    if not (a==0 or b==0 or c==0):
        print("eine Seite muss 0 sein!")
        return
    if not ((a>0 and b>0) or (a>0 and c>0) or (b>0 and c>0)):
        print("Zwei Werte müssen gesetzt sein!")
        return
    if c == 0:
        return math.sqrt(a**2 + b**2)
    if a == 0:
        return math.sqrt(c**2 - b**2)
    if b == 0:
        return math.sqrt(c**2 - a**2)

print(pythagoras(a=3,b=4))
print(pythagoras(c=5,b=4))
print(pythagoras(a=3,c=5))

print(pythagoras(a=3,b=4,c=5))
print(pythagoras(a=3))
print(pythagoras())

Rückgabewerte

Das Unterprogramm kann mit dem Schlüsselwort return einen sogenannten Rückgabewert liefern. return stellt das Ende des Unterprogramms dar. Der Rückgabewert kann von einem beliebigen Datentyp sein.

Aufgabe: Quadratische Gleichung

Bekanntlicherweise lassen sich Quadratische Gleichungen der Form

ax2+bx+c=0

mit der folgenden Lösungsformel lösen.

x1,2=b±b24ac2a

Das Spezielle: es kann kein, eine oder zwei Lösungen geben!

  • Die Gleichung x21=0 sollte zwei Lösungen haben: -1 und 1
  • Die Gleichung x22x+1=0 hat genau eine Lösung: 1
  • Die Gleichung x2+1=0 hat keine Lösung

Die untenstehende Funktion zeigt die Lösungen einer Quadratischen Gleichung gegeben durch ihre Koeffizienten a, b und c an:

python
import math

def quadr(a,b,c):
    D = b**2 - 4*a*c
    if D < 0:
        print("keine Lösung")
    elif D == 0:
        x = (-b + math.sqrt(D))/2*a
        print(x)
    else:
        x1 = (-b + math.sqrt(D))/2*a
        x2 = (-b - math.sqrt(D))/2*a
        print(x1, x2)

quadr(1,0,-1)
quadr(1,-2,1)
quadr(1,0,1)

Verbessere nun die Funktion: Statt mit print zu arbeiten, soll die Funktion Werte zurückliefern die weiterverwendet werden können!

Lösung: Quadratische Gleichung

Das Problem bei diesem Beispiel ist, dass nicht immer einfach eine Zahl als Resultat zurückgeliefert werden kann. Es kann ja einee, zwei oder keine Lösung geben. Eine einfacher Ansatz wäre, eine Liste mit den Lösungen zurückzugeben. Diese Liste kann ein oder zwei Zahlen enthalten, oder halt leer sein. Aber wir geben so immer dasselbe – eine Liste – zurück.

python
import math

def quadr(a,b,c):
    D = b**2 - 4*a*c
    if D < 0:
        return []
    elif D == 0:
        x = (-b + math.sqrt(D))/2*a
        return([x])
    else:
        x1 = (-b + math.sqrt(D))/2*a
        x2 = (-b - math.sqrt(D))/2*a
        return([x1, x2])

print(quadr(1,0,-1))
print(quadr(1,-2,1))
print(quadr(1,0,1))

Gymnasium Kirchenfeld, fts & ros