0%

Hoofdstuk 8

Zelf functies schrijven

Maak van een taak een functie

Aan het einde van hoofdstuk 7 bouwde je een menu dat items kon toevoegen, tonen en tellen. Het werkte, maar de lus moest elk detail uitleggen:

while True:
    command = input("Command: ").strip().lower()

    if command == "add":
        # ask for an item, store it, and confirm it
        ...
    elif command == "list":
        # handle an empty list or print every numbered item
        ...
    elif command == "count":
        # report the number of items
        ...

Om de opdracht list te begrijpen, moet een lezer die tak zoeken en alle regels erin lezen. De lus doet twee taken tegelijk: een actie kiezen en uitleggen hoe elke actie werkt.

Je weet al wat dat kan verbeteren.

if command == "add":
    add_item(items)
elif command == "list":
    show_items(items)
elif command == "count":
    show_count(items)

Nog voordat je weet hoe die drie functies zijn gedefinieerd, kun je het plan lezen. Elke naam beantwoordt de vraag: ‘Wat gebeurt er bij deze opdracht?’

Dat is de belangrijkste reden om een functie te schrijven: ze geeft één begrijpelijke bewerking een naam.

Je gebruikt al functies

In hoofdstuk 3 maakte je kennis met functieaanroepen:

name = input("What is your name? ")
letter_count = len(name)
print(letter_count)

input, len en print zijn functies. Je kent drie belangrijke onderdelen van hun gedrag:

  • Een aanroep gebruikt haakjes, zoals in len(name).

  • Een aanroep kan een argument krijgen, zoals name.

  • Een aanroep kan een teruggegeven waarde opleveren, zoals het getal uit len(name).

Tot nu toe had iemand anders elke functie geschreven die je aanriep. Dit hoofdstuk geeft je de andere helft: zelf functies definiëren.

Eerst definiëren, dan aanroepen

Een functiedefinitie begint met def. Ze beschrijft wat er moet gebeuren wanneer de functie wordt aangeroepen:

Try it

De definitie heeft twee delen:

def show_count(items):

Deze eerste regel geeft de functie haar naam en zegt welke informatie ze verwacht.

    print(f"Items stored: {len(items)}")

Het ingesprongen blok bevat het werk.

De functie definiëren voert dat werk niet uit. Python onthoudt de definitie. Het werk gebeurt later, bij de aanroep:

show_count(books)

Die scheiding is handig. Definieer een bewerking één keer en roep haar daarna aan waar het programma haar nodig heeft.

Een naam geeft een bruikbaar detailniveau

Stel dat je deze aanwijzingen leest:

Verplaats je rechtervoet, verplaats je gewicht, verplaats je linkervoet, verplaats je gewicht en blijf dat herhalen.

De meeste mensen zouden gewoon zeggen:

Loop naar de deur.

Die kortere instructie is nuttig omdat het woord lopen een vertrouwde handeling benoemt. Een goede functienaam doet hetzelfde voor code. Het ene deel van het programma kan het plan noemen, terwijl het functieblok de details bevat.

Functies verbeteren een programma niet automatisch. Een vage naam als do_thing() verbergt informatie. Een gerichte naam als show_items() maakt de bedoeling duidelijk.

In dit hoofdstuk leer je de details schrijven en de namen kiezen.

Wat drukt dit programma af?

def announce():
    print("The gate is open.")

print("Ready.")

Welke functienaam vat de taak het duidelijkst samen?