Funktionen

Funktionen sind eines der wichtigsten Konzepte von Programmiersprachen. In der Praxis müssen wir oft dieselben Aufgaben wieder und wieder lösen. Diese Codeblöcke können wir nun in Funktionen auslagern und bei Bedarf aufrufen. Dadurch brauchen wir den Code nicht wiederholt schreiben, was zu deutlich weniger Fehler führt. Weiters könne Funktion auch besser gewartet und getestet werden.

Die Syntax für Funktionen in Python lautet:

def function_name(parameters):
    """docstring"""
    statement(s)

Diese besteht also aus dem Funktionsnamen (funtion_name), den Parametern (parameters), dem Dokumentationsstring (docstring) und weiteren Pythoncode (statements).

Minimale leere Funktionen

In vielen Tutorials findet man die folgenden minimalen Funktionen.

def f1():
    pass
f1()
def f2():
    ...
f2()
def f3():
    """ToDo: Implement"""
f3()

Wir sehen, dass alle 3 Funktionen gültige Python-Funktionen sind. Als minimale leere Python-Funktion wollen wir aber das folgende Muster verwenden.

def f():
    """description of the function"""
    pass
f()

Wenn wir also eine leere Funktion definieren, so sollten wir diese minimale Muster verwenden.

Mit help() können wir den docstring auslesen.

help(f)
Help on function f in module __main__:

f()
    description of the function

Einfache Funktonen schreiben

Wir halten uns nun immer an das Muster für Python-Funktionen:

def function_name(parameters):
    """docstring"""
    statement(s)

Um mit dem Muster einer minimalen Python-Funktion vertraut zu werden, wollen wir nun die Methoden add, sub, mul und div als Python-Funktionen implementieren.

def add(x,y):
    """returns x plus y"""
    return x + y
add(2,3)
5
def sub(x,y):
    """returns x minus y"""
    return x - y
sub(2,3)
-1
def mul(x,y):
    """returns x times y"""
    return x*y
mul(2,3)
6
def div(x,y):
    """returns x divided by y"""
    return x/y
div(2,3)
0.6666666666666666

Rückgabewerte von Funktionen

In den obigen Beispielen wurde immer nur ein Rückgabewert von der Funktion zurückgegeben.

def f_single_return():
    "returns a constant"
    return 3.14
f_single_return()
3.14

Wenn eine Funktion nur einen Wert zurück gibt, so erhalten wir eine Instanz eines Datentyps. Im nächsten Beispiel sollen mehrere Werte zurückgegeben werden.

def f_multi_return():
    "returns some values"
    return 3.14, "pi"
f_multi_return()
(3.14, 'pi')
type(f_multi_return())
tuple

Werden also mehrere Werte von einer Funktion zurückgeben, so erhalten wir ein Tuple mit den Rückgabewerten.

Dieses Tuple könnten wir wie schon bekannt einfach entpacken.

pi, name = f_multi_return()
print(pi)
print(name)
3.14
pi

Durch das Benutzen von [] werden die Rückgabewerte in Listen verpackt.

def f_multi_return_list():
    "returns a constant"
    return [3.14, "pi"]
f_multi_return_list()
[3.14, 'pi']
type(f_multi_return_list())
list

Auch die Listen können wir wieder direkt entpacken.

pi, name = f_multi_return_list()
print(pi)
print(name)
3.14
pi

Hilfe für Funktionen

Als erstes sollten wir immer help() verwenden, um uns über eine Funktion zu informieren.

help(add)
Help on function add in module __main__:

add(x, y)
    returns x plus y

Der Vollständigkeit halber wollen wir noch ein paar andere Möglichkeiten aufzeigen, da diese in Foren anzutreffen sind. Der docstring kann mit

add.__doc__
'returns x plus y'

ausgelesen werden. Sauberer ist es jedoch das Modul inspect der Python-Standardbibliothek zur verwenden.

import inspect
inspect.getdoc(add)
'returns x plus y'

Mit function? und function?? erhalten wir weiter Infos.

add?
Signature: add(x, y)
Docstring: returns x plus y
File:      /tmp/ipykernel_32639/2886208130.py
Type:      function
add??
Signature: add(x, y)
Source:   
def add(x,y):
    """returns x plus y"""
    return x + y
File:      /tmp/ipykernel_32639/2886208130.py
Type:      function

Default-Werte im Argument

Default-Werte im Argument sind oft sehr hilfreich um Routineaufgaben abzuarbeiten.

def greet(name, message='Hi'):
    return f"{message} {name}"

greet(name="Peter")
'Hi Peter'

Wir sehen also, dass wir nur einen Parameter als Argument übergeben müssen. Wollen wir nun den Gruß verändern, müssen wir auch den zweiten Parameter übergeben.

print(greet(name='Peter',message='Hallo'))
print(greet(name='Hans',message='Servus'))
Hallo Peter
Servus Hans