2.14. Functies definiëren

Een functie verpakt een codeblok onder een naam zodat het vanuit veel plaatsen kan worden aangeroepen. Overal waar een berekening, actie of vormgegeven stuk werk meer dan eens voorkomt, maakt een functie er één enkel benoemd ding van.

Het sleutelwoord is def:

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

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

Uitvoer:

hello, Alice
hello, Bob

De regel die begint met def is de definitie – deze creëert de functie maar voert de body niet uit. Het aanroepen van greet("Alice") is wat het ingesprongen blok uitvoert.

2.14.1. Parameters en argumenten

De namen tussen de haakjes op de def-regel zijn parameters – plaatshouders voor waarden die de aanroeper zal leveren. De daadwerkelijk doorgegeven waarden zijn argumenten. Een functie kan nul of meer parameters aannemen:

def square(x):
    return x * x

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

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

Een aanroep met het verkeerde aantal argumenten veroorzaakt onmiddellijk een TypeError.

2.14.2. return

Een return-statement beëindigt de functie onmiddellijk en geeft een waarde terug aan de aanroeper:

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

Een functie die nooit een return bereikt (of een kale return zonder waarde heeft) retourneert None:

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

Een functie kan meerdere return-statements hebben; de eerste die wordt bereikt wint, en de rest van de body wordt overgeslagen.

2.14.2.1. Meerdere waarden retourneren

Python retourneert één object per aanroep, maar dat object kan een tuple zijn – en de aanroeper kan het ter plekke uitpakken:

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

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

De haakjes rond de retourwaarde zijn optioneel; return a, b en return (a, b) zijn hetzelfde.

2.14.3. Docstrings

Een string-literal die als eerste statement van een functie-body wordt geplaatst, is een docstring. Deze wordt opgeslagen op het functie-object en is wat help() weergeeft:

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

De IDE toont docstrings in tooltips wanneer de cursor over de functienaam zweeft, dus zelfs een samenvatting van één regel verdient zichzelf terug. Triple-quoted strings laten de docstring meerdere regels beslaan wanneer meer detail nuttig is.

2.14.4. Naamgevingsconventies

Functienamen gebruiken snake_case – kleine letters gescheiden door underscores. De naam moet beschrijven wat de functie doet:

  • Goed: read_temperature, parse_header, is_valid.

  • Vermijd: do_stuff, handle1, temp_func.

Een voorafgaande underscore (_helper) markeert een functie als intern voor zijn module. De conventie wordt breed gerespecteerd maar niet afgedwongen door Python.