3.4. Flow#

Code wordt niet altijd uitgevoerd in dezelfde volgorde als waarin je hem geschreven hebt. Dit hebben wij al gezien bij for-loops en if-statements. Bij for-loops kon het gebeuren dat een deel van de code meerdere keren achter elkaar uitgevoerd werd, en if-statements konden ervoor zorgen dat hele stukken code overgeslagen werden.

3.4.1. Voorbeeld met if, elif, else#

Hieronder zie je een voorbeeld van hoe code uitgevoerd wordt. De code wordt in de volgorde van de blauwe pijlen uitgevoerd, de delen met een rood kruis worden overgeslagen.

Door het gebruik van -loops en -statements worden delen van de code overgeslagen of meerdere keren uitgevoerd.

Klik hier voor de bovenstaande code
# We beginnen hier
x = 113  # Het getal waarvan we willen weten of het priem is
priem = True  # een beginwaarde

# Daarna gaan we dit blok in
if x in [0, 1]:
    # Deze code wordt niet uitgevoerd
    priem = False
elif x == 2:
    # Deze code wordt ook niet uitgevoerd
    priem = True
else:
    # Deze code wordt wel uitgevoerd
    for n in range(2, int(x ** 0.5 + 1)):
        # Deze code wordt acht keer uitgevoerd
        if x % n == 0:
            # Deze code wordt nooit uitgevoerd
            priem = False

# Tenslotte komen we hier
if priem:
    # Dit wordt wel uitgevoerd
    print(str(x) + ' is een priemgetal')
else:
    # Maar dit wordt niet uitgevoerd
    print(str(x) + ' is geen priemgetal')

3.4.2. Functies#

Wanneer we hier functies aan toe voegen kan het nog vaker gebeuren dat code niet, of pas op een later moment, uitgevoerd wordt. Dit hebben we eerder in deze instructie ook al gezien. Wanneer je een functie definieert wordt de code daarin nog niet meteen uitgevoerd.

def test():
    ''' Een test functie
    input:
    output:
    '''
    print('Hallo, ik doe het!')
    return

Wanneer we de bovenstaande code uitvoeren zal er nog niks gebeuren. Pas op het moment dat we test() aanroepen in de code wordt de inhoud van de functie uitgevoerd en zal de boodschap ook geprint worden.

test()
Hallo, ik doe het!

3.4.3. Meerdere functies in een stapeltje#

Wanneer we meerdere functies in één script hebben zullen deze dus ook niet in de volgorde waarin ze in het script staan, maar in de volgorde waarin ze aangeroepen worden uitgevoerd worden.

def deelbaar(x, n):
    ''' controleer of x deelbaar is door n
    input:
        x (int)
        n (int)
    output:
        deelbaar (bool)
    '''
    print(f'Ik voer de functie "deelbaar({x}, {n})" uit')
    if x % n == 0:
        return True
    else:
        return False

def is_priem(x):
    ''' controleer of x een priemgetal is
    input:
        x (int)
    output:
        priem (bool)
    '''
    print('Ik voer de functie "is_priem({x})" uit')
    priem = True

    if x in [0, 1]:
        priem = False
    elif x == 2:
        priem = True
    else:
        for n in range(2, int(x ** 0.5 + 1)):
            if deelbaar(x, n):
                priem = False

    return priem

x = 113

if is_priem(x):
    print(str(x) + ' is een priemgetal')
else:
    print(str(x) + ' is geen priemgetal')
Ik voer de functie "is_priem({x})" uit
Ik voer de functie "deelbaar(113, 2)" uit
Ik voer de functie "deelbaar(113, 3)" uit
Ik voer de functie "deelbaar(113, 4)" uit
Ik voer de functie "deelbaar(113, 5)" uit
Ik voer de functie "deelbaar(113, 6)" uit
Ik voer de functie "deelbaar(113, 7)" uit
Ik voer de functie "deelbaar(113, 8)" uit
Ik voer de functie "deelbaar(113, 9)" uit
Ik voer de functie "deelbaar(113, 10)" uit
113 is een priemgetal

Hier wordt de functie is_priem pas onderin het script daadwerkelijk uitgevoerd. Deze functie wordt één keer uitgevoerd, met als input 113, maar de functie deelbaar wordt in totaal acht keer uitgevoerd in dit script. Deze wordt namelijk aangeroepen in de for-loop binnen de functie is_priem.

3.4.4. return#

Ten slotte moeten we nog kijken naar het effect van het return keyword op de flow van je code. Wanneer python binnen een functie return tegenkomt zal de functie namelijk meteen beëindigd worden. Alles wat daarna komt wordt niet meer uitgevoerd.

def test_functie(a, b, c):
    d = a + b
    e = a * c
    f = d / e
    return f
    g = d + e + f
    print(g)
    return g

Deze functie zal stoppen zodra het eerste return statement (return f) bereikt is. De drie regels daaronder zullen nooit uitgevoerd worden en de variabele g wordt nooit aangemaakt of teruggegeven.

Hier kunnen we ook gebruik van maken. Door return slim in te zetten in onze functies kunnen we ervoor zorgen dat de computer nooit overbodig veel rekenwerk doet. Dit is bijvoorbeeld het geval in de onderstaande code die bepaalt of een getal een priemgetal is. Zodra python voor de eerste keer een return statement tegenkomt in de code is_priem zal deze stoppen met het uitvoeren van de functie en het resultaat teruggeven.

def deelbaar(x, n):
    ''' controleer of x deelbaar is door n
    input:
        x (int)
        n (int)
    output:
        deelbaar (bool)
    '''
    if x % n == 0:
        return True
    return False

def is_priem(x):
    ''' controleer of x een priemgetal is
    input:
        x (int)
    output:
        priem (bool)
    '''
    if x in [0, 1]:
        return False
    if x == 2:
        return True
    else:
        for n in range(2, int(x ** 0.5 + 1)):
            if deelbaar(x, n):
                return False
    return True

x = 113

if is_priem(x):
    print(str(x) + ' is een priemgetal')
else:
    print(str(x) + ' is geen priemgetal')
113 is een priemgetal