04 2025-2026
We breiden onze kennis van loops verder uit, leren hoe libraries ons werk makkelijker, hoe we code kunnen testen met unit tests en hoe we modules importeren en exporteren om code te hergebruiken.
LOOPS EXTENDED
01
01
LOOPS EXTENDED
Stel je voor dat je een gebruiker om een getal vraagt, maar je wilt zeker weten dat het groter is dan 5. In plaats van dit meerdere keren handmatig te herhalen zoals hieronder
gebruik je beter een while-loop om dit dynamisch te doen.
n = int(input("Geef me een nummer boven 5? "))
if n < 5:
n = int(input("Geef me een nummer boven 5? "))
if n < 5:
n = int(input("Geef me een nummer boven 5? "))while True:
n = int(input("Geef me een nummer boven 5? "))
if n > 5:
break01
LOOPS EXTENDED
Met een continue en break kun je invoer elegant controleren. Stel dat je enkel positieve getallen wilt.
Of als je iets x keer wilt uitvoeren, zoals het printen van een naam:
while True:
n = int(input("Geef me een positief nummer? "))
if n < 0:
continue # Negatief? Vraag opnieuw
else:
break # Positief? Stop de loopwhile True:
n = int(input("Hoeveel keer moet ik Milan printen? "))
if n > 0:
break
for _ in range(n):
print("Milan")01
LOOPS EXTENDED
Je code opsplitsen in functies is niet alleen een goede programmeerstijl maar zo houd je alles netjes en herbruikbaar.
def main():
number = get_number()
blub(number)
def get_number():
while True:
n = int(input("Hoeveel keer moet ik blub printen? "))
if n > 0:
return n
def blub(n):
for _ in range(n):
print("Blub")
main()01
LOOPS EXTENDED
Wanneer je met lijsten werkt, kun je direct over de items lopen, of je kunt ook indexen gebruiken als je de positie nodig hebt
students = ["Francisco", "Nanine", "Valerie", "Xander"]
for i in range(len(students)):
print(i + 1, ":", students[i])Uitvoer
1 : Francisco
2 : Nanine
3 : Valerie
4 : Xander
01
LOOPS EXTENDED
We kunnen ook expliciet zeggen dat iets geen waarde heeft. Dit gebeurd door het keyword 'None'. Hier gebruiken we dit om te zeggen dat een functie niets bruikbaars kon teruggeven.
def check_numbers(n):
if n < 0:
return None
return n
print(check_numbers(3)) # Geeft 3 terug
print(check_numbers(-1)) # Geeft None terug01
LOOPS EXTENDED
Wat als de gebruiker tekst typt in plaats van een getal? Dan krijg je normaal een fout! Maar met try / except kun je dit voorkomen:
def get_int():
while True:
try:
x = int(input("What is x? "))
except ValueError:
# Je kan hier een foutmelding geven
# print("Dat is geen geldig getal.")
pass # Negeer de fout en probeer opnieuw
else:
break
return x
def main():
x = get_int()
print(f"x is {x}")
main()LIBRARIES
02
01
02
LIBRARIES
"A library is a collection of prewritten code, created either by others or by yourself, that can be imported and reused in a program. Instead of rewriting the same functionality multiple times, developers can use libraries to access ready-made functions and tools directly"
02
LIBRARIES
In Python wordt een bibliotheek een module genoemd. Een module is een bestand met Python-code dat functies, variabelen en soms ook klassen bevat, die je eenvoudig in andere programma’s kunt hergebruiken.
Python heeft standaard al veel ingebouwde modules. We zullen even een paar modules onder de loep nemen.
random: genereert willekeurige getallen of keuzes.
statistics: berekent statistische waarden zoals gemiddelde of mediaan.
datetime: werkt met datums en tijden.
Meer modules ontdekken en wat ze kunnen? Ga dan naar de documentatie
02
LIBRARIES
Om een module te importeren in je script doen we dit via het keyword import
Laten we een simpel programma schrijven waar we een muntje opgooien met een 50/50 kans.
import randomimport random
# List met mogelijke uitkomsten
choices = ["Kop", "Munt"]
# Willekeurig een uitkomst kiezen
result = random.choice(choices)
# Resultaat weergeven
print("Uitkomst van de muntworp:", result)02
LIBRARIES
In plaats van random.choice kunnen we nu enkel choice schrijven.
from random import choicecoin = choice(["Kop", "Munt"])
print(coin)Vroeger moesten programmeurs opletten dat functies en variabelen geen naamconflicten veroorzaakten (bijvoorbeeld een eigen functie choice tegenover de geïmporteerde choice). Met from-import kun je specifieke functies laden, waardoor de code overzichtelijker blijft, vooral in kleine scripts.
In Python kun je niet alleen een hele module importeren, maar ook specifieke functies. Dit doen we met het sleutelwoord from.
02
LIBRARIES
Dit kan handig zijn voor een raadspel, waarin een speler moet raden welk getal de computer heeft gekozen.
import random
number = random.randint(1, 10)
print(number)import random
cards = ["Koning", "Koningin", "Boer", "Aas"]
random.shuffle(cards)
print("Geschudde kaarten:", cards)Met randint() krijg je een willekeurig getal tussen a en b (beide inclusief)
De functie random.shuffle(seq) neemt een lijst en schudt de elementen door elkaar. Dit werkt zoals het schudden van een kaartspel.
02
LIBRARIES
import statistics
average = statistics.mean([90, 80])
print("Gemiddelde:", average)Gemiddelde: 85De statistics-module in Python helpt bij het uitvoeren van wiskundige berekeningen op datasets. Dit is handig voor data-analyse, wetenschappelijke berekeningen en machine learning.
Uitvoer
02
LIBRARIES
from datetime import datetime
now = datetime.now()
print("Huidige datum en tijd:", now)Huidige datum en tijd: 2025-08-30 14:23:45.678912De datetime-module in Python helpt bij het werken met datums en tijden. Dit is handig voor het bijhouden van tijdstempels, het berekenen van tijdsverschillen , etc...
Uitvoer
02
LIBRARIES
| Functie | Beschrijving | Voorbeeld |
|---|---|---|
| random.choice() | Kiest willekeurig een element uit een lijst | random.choice(["a", "b"]) |
| random.randint(a,b) | Genereert een willekeurig geheel getal tussen a en b | random.randint(1, 10) |
| random.shuffle() | Schudt de elementen in een list door elkaar. | random.shuffle(kaarten) |
| Functie | Beschrijving | Voorbeeld |
|---|---|---|
| statistics.mean(data) | Bereken het gemiddelde van een lijst | statistics.mean([10, 20, 30]) |
| statistics.median(data) | Bereken de mediaan (middelste waarde) | statistics.median([10, 20, 30]) |
| statistics.stdev(data) | Bereken de standaardafwijking | statistics.stdev([10, 20, 30, 40]) |
| Functie | Beschrijving | Voorbeeld |
|---|---|---|
| datetime.now() | Huidige datum en tijd ophalen. |
datetime.now() |
| date.today() | Alleen de huidige datum ophalen. | date.today() |
| datetime(y, m, d) | Een specifieke datum aanmaken | datetime(2025, 12, 31) |
02
LIBRARIES
Je gaat een Python-programma maken dat vier temperatuurmetingen van vandaag genereert en een kleine statistiek berekent.
Genereer vier metingen
Gebruik random om vier temperaturen tussen -5°C en 35°C te genereren.
Datum toevoegen
Gebruik datetime om vandaag als datum te gebruiken.
Bereken statistieken
Gebruik statistics om het gemiddelde, minimum en maximum van de vier metingen te berekenen.
Print alles netjes
Datum: 2025-10-19
Metingen: [12, 18, 15, 8]
Gemiddelde: 13.25
Min: 8
Max: 18PACKAGES
03
01
03
PACKAGES
Met pakketten kun je extra functionaliteit aan Python toevoegen. Ze zijn gemaakt door anderen en beschikbaar op pypi.org. Installeren doe je eenvoudig met pip, de standaard package manager van Python.
We focussen nu op twee pakketten: cowsay en requests. Lees altijd de documentatie om te zien welke functies beschikbaar zijn.
cowsay: een knipoog naar een klassiek programma dat tekst toont met ASCII-art.
requests: een eenvoudige manier om HTTP-verzoeken te doen (later uitgebreider bij API’s).
03
PACKAGES
We zullen nu gebruik maken van een externe package 'cowsay' om ASCII-art te laten verschijnen.
Open de terminal en voer het volgende command uit.
pip install cowsayImporteer nu het pakket in het script. Maak een bestand moo.py aan.
import cowsay
import sys
if len(sys.argv) == 2:
cowsay.cow("Hallo, " + sys.argv[1])sys.argv is een ingebouwde module die we kunnen gebruiken om argumenten mee te geven aan de uitvoering van ons bestand. Alles wat je na de naam van het bestand meegeeft zit in de sys.argv list.
Voer nu het script uit met een argument.
python moo.py Jan03
PACKAGES
Ga nu zelf eens naar de documenatie van cowsay (pip docs) en test verschillende 'figuren' uit.
03
PACKAGES
Met de 'requests'-package kunnen we gegevens van het internet ophalen via een API.
Een API (Application Programming Interface) is een systeem waarmee we gegevens van derden kunnen opvragen en gebruiken in onze eigen programma's. De meeste API’s zijn tegenwoordig beschikbaar via het internet.
Installeer de package requests door het volgende command uit te voeren.
pip install requests03
PACKAGES
Maak een nieuw bestand songs.py en voeg volgende code toe.
import requests
import sys
import json
if len(sys.argv) != 2:
sys.exit("Gebruik: python songs.py <zoekterm>")
response = requests.get(f"https://itunes.apple.com/search?entity=song
&limit=1&term={sys.argv[1]}")
# Print de ruwe JSON-data
print(json.dumps(response.json(), indent=2))
# Toon alleen de tracknaam
o = response.json()
for result in o['results']:
print("Tracknaam:", result['trackName'])Proficiat, Je hebt je eigen spotify gemaakt!
03
PACKAGES
Nu gebruiken we code van anderen maar we kunnen evengoed onze eigen code hergebruiken als een package.
Maak een nieuw bestand greetings.py en plaats volgende code.
def main():
hello("wereld")
goodbye("wereld")
def hello(name):
print(f"Hallo, {name}")
def goodbye(name):
print(f"Tot ziens, {name}")
main()03
PACKAGES
We maken nu een ander bestand say.py waar we onze vorige code importeren.
from greetings import hello
import sys
if len(sys.argv) == 2:
hello(sys.argv[1])Voer nu het script uit in de terminal.
python say.py <naam> Wat gebeurd er? Wat zou de oorzaak hier van kunnen zijn? Bespreek.
03
PACKAGES
Wanneer we de functie 'hello' uitvoeren in say.py, wordt de hele code in greetings.py gelezen en uitgevoerd, inclusief de aanroep van main(). Dit kunnen we oplossen door 1 regel code.
def main():
hello("wereld")
goodbye("wereld")
def hello(name):
print(f"Hallo, {name}")
def goodbye(name):
print(f"Tot ziens, {name}")
if __name__ == "__main__": #nieuwe regel
main()Pas greetings.py aan
Hiermee zorgen we dat main() alleen wordt uitgevoerd als het script direct wordt uitgevoerd, en niet als het wordt geïmporteerd.
03
PACKAGES
Met een virtual environment blijven pakketten per project gescheiden, voorkom je conflicten en kunnen anderen eenvoudig de juiste versies installeren.
python -m venv venv
venv\Scripts\activateWe maken een virtual environment aan in de terminal.
Dit is voor Windows
python3 -m venv venv
source venv/bin/activateDit is voor Mac/Linux
Na deze commando’s verschijnt in de terminal (venv), wat aangeeft dat je je in de virtuele omgeving bevindt.
03
PACKAGES
Nu kunnen we eenvoudig pakketten installeren zonder het hele systeem te beïnvloeden. Daarnaast kunnen we een lijst van geïnstalleerde pakketten opslaan, zodat anderen die later gemakkelijk kunnen gebruiken.
pip freeze > requirements.txtWe maken een virtual environment aan in de terminal.
pip install -r requirements.txtHiermee wordt een bestand requirements.txt gemaakt met een lijst van alle packages. Dit maakt het makkelijk voor anderen om dezelfde packages te installeren.
UNIT TESTING
04
01
04
UNIT TESTING
"Unit testing is the practice of automating the verification of your code. Instead of manually providing input, searching for errors, fixing them, and rerunning the program, unit tests automatically check whether the code behaves as expected, providing faster feedback and making it easier to detect and fix issues."
04
UNIT TESTING
We maken een eenvoudig programma waar we berekening kunnen testen en zullen deze door een aantal tests laten lopen.
Maak een bestand calculator.py aan en voer volgende code in
Handmatig testen van calculator.py is niet systematisch en kan fouten missen. Tijd voor unit tests.
def main():
x = int(input("Wat is x? "))
print("x in het kwadraat is", square(x))
def square(number):
return number * number
if __name__ == "__main__":
main()04
UNIT TESTING
Laten we een nieuw bestand maken, test_calculator.py, om onze calculator.py te testen. Testbestanden krijgen vaak de prefix test_. Hierin testen we bijvoorbeeld de functie square():
Maak een bestand test_calculator.py aan en voer volgende code in
from calculator import square
def main():
test_square()
def test_square():
if square(2) != 4:
print("2 in het kwadraat was niet 4")
if square(3) != 9:
print("3 in het kwadraat was niet 9")
if __name__ == "__main__":
main()04
UNIT TESTING
Wanneer we dit bestand uitvoeren krijgen we geen output wat op zich een goed teken is. Stel je nu voor dat we een fout hadden gemaakt in onze functie square().
Introduceer volgende fout in calculator.py
def square(number):
return number + number # Fout: moet vermenigvuldigen in plaats van optellenAls we nu test_calculator.py uitvoeren, krijgen we als resultaat dat 3 in het kwadraat niet 9 was. Dit is de eerste aanwijzing dat er iets mis is, en dit benadrukt waarom we veel tests moeten uitvoeren.
04
UNIT TESTING
De vorige methode werkt, maar is omslachtig. Met assert kunnen we controleren of een uitdrukking waar is; anders genereert Python automatisch een AssertionError.
Verander test_square() naar onderstaande code.
def test_square():
assert square(2) == 4
assert square(3) == 9
assert square(-2) == 4
assert square(-3) == 9
assert square(0) == 0Bij het uitvoeren van het script worden fouten nu automatisch weergegeven. Bij een mislukking ziet de output er bijvoorbeeld zo uit:
AssertionError: assert 6 == 04
UNIT TESTING
Hoewel assert handig is, is de foutoutput soms moeilijk te lezen. Met de populaire Python-bibliotheek pytest kunnen we tests automatisch uitvoeren en resultaten overzichtelijk weergeven.
Om pytest te gebruiken, installeer je volgende package.
pip install pytestDit zal een veel nettere output geven waarin je precies kunt zien welke tests zijn mislukt en waarom.
Na installatie kunnen we onze tests uitvoeren met pytest i.p.v python
py -m pytest test_calculator.py04
UNIT TESTING
Tests zijn niet enkel voor getallen maar kunnen voor elke soort datatypes gedaan worden. We nemen een voorbeeld waar we een naam vragen.
Plaats volgende code in een bestand genaamd hello.py
def main():
name = input("Wat is je naam? ")
hello(name)
def hello(to="world"):
return f"Hello, {to}"
if __name__ == "__main__":
main()04
UNIT TESTING
Het is handing om onze tests te verdelen in meerdere functies om het overzichtelijker te maken.
Maak een bestand test_hello.py aan en voer volgende code in.
from hello import hello
def test_hello():
assert hello("Niels") == "Hello, Niels"
assert hello() == "Hello, world"Na het uitvoeren van de test zie je snel waar een fout kan zitten. Bij meerdere tests kun je ze in een tests/-map plaatsen; pytest detecteert dan automatisch bestanden die beginnen met test_ of eindigen op _test.py.