2.14. Funktionen definieren

Eine Funktion fasst einen Codeblock unter einem Namen zusammen, sodass er von vielen Stellen aus aufgerufen werden kann. Überall dort, wo eine Berechnung, eine Aktion oder ein abgegrenztes Stück Arbeit mehr als einmal auftaucht, macht eine Funktion daraus eine einzige benannte Einheit.

Das Schlüsselwort ist def:

def greet(name):
    print("hello,", name)

greet("Alice")
greet("Bob")

Ausgabe:

hello, Alice
hello, Bob

Die mit def beginnende Zeile ist die Definition – sie erzeugt die Funktion, führt aber den Rumpf nicht aus. Der Aufruf greet("Alice") ist das, was den eingerückten Block ausführt.

2.14.1. Parameter und Argumente

Die Namen in den Klammern der def-Zeile sind Parameter – Platzhalter für Werte, die der Aufrufer liefern wird. Die tatsächlich übergebenen Werte sind Argumente. Eine Funktion kann null oder mehr Parameter annehmen:

def square(x):
    return x * x

def add(a, b):
    return a + b

def is_even(n):
    return n % 2 == 0

Ein Aufruf mit der falschen Anzahl von Argumenten löst sofort TypeError aus.

2.14.2. return

Eine return-Anweisung beendet die Funktion sofort und gibt einen Wert an den Aufrufer zurück:

def absolute(x):
    if x < 0:
        return -x
    return x

Eine Funktion, die nie ein return erreicht (oder ein nacktes return ohne Wert hat), gibt None zurück:

>>> def shout(text):
...     print(text.upper())
...
>>> result = shout("hi")
HI
>>> print(result)
None

Eine Funktion kann mehrere return-Anweisungen haben; die erste erreichte gewinnt, und der Rest des Rumpfes wird übersprungen.

2.14.2.1. Mehrere Werte zurückgeben

Python gibt pro Aufruf ein Objekt zurück, aber dieses Objekt kann ein tuple sein – und der Aufrufer kann es direkt entpacken:

def minmax(values):
    return (min(values), max(values))

lo, hi = minmax([3, 1, 4, 1, 5, 9])

Die Klammern um den Rückgabewert sind optional; return a, b und return (a, b) sind dasselbe.

2.14.3. Docstrings

Ein String-Literal, das als erste Anweisung in einem Funktionsrumpf platziert wird, ist ein Docstring. Es wird am Funktionsobjekt gespeichert und ist das, was help() anzeigt:

def scale(value, factor):
    """Multiply ``value`` by ``factor`` and return the result."""
    return value * factor

Die IDE zeigt Docstrings in Tooltips an, wenn der Cursor über dem Funktionsnamen schwebt, sodass sich selbst eine einzeilige Zusammenfassung lohnt. Mit dreifach in Anführungszeichen gesetzten Strings kann sich der Docstring über mehrere Zeilen erstrecken, wenn mehr Details nützlich sind.

2.14.4. Namenskonventionen

Funktionsnamen verwenden snake_case – kleingeschriebene Wörter, die durch Unterstriche getrennt sind. Der Name sollte beschreiben, was die Funktion tut:

  • Gut: read_temperature, parse_header, is_valid.

  • Vermeiden: do_stuff, handle1, temp_func.

Ein führender Unterstrich (_helper) kennzeichnet eine Funktion als modulintern. Die Konvention wird allgemein respektiert, aber von Python nicht erzwungen.