Fijne functies#

Met functies worden grote programma’s opgedeelt in kleinere eenheden. Dit maakt het programmeren overzichtelijker. Functies die voor het ene programma zijn ontwikkeld, kunnen in andere programma’s gebruikt worden. Een functie beschrijft het rekenproces dat op de parameters van de functie moet worden uitgevoerd.

Belangrijke functies#

  • range

  • sum

  • choice

Range#

range geeft een iterator met integers terug. Het maakt niet uit als je niet precies weet wat een iterator is, het belangrijkst is dat je ziet dat list de iterator omzet naar een lijst met integers:

l = list(range(0, 100))
print(l)

ouput: [0, 1, 2, ..., 99]

Sum#

sum telt een lijst van getallen op, en range maakt een lijst met integers (of eigenlijk een iterator met integers, maar daar kan sum ook mee overweg):

s = sum(range(3,11))
print(s)

ouput: 52

l = list(range(3,11))
print(sum(l))

ouput: 52

Choice#

Choice is een functie dat een random keuze kan maken uit een gegeven lijst. Het is alleen niet standaard beschikbaar zoals de functies sum en range. Om de functie te kunnen gebruiken moeten we het eerst importeren.

from random import choice
l = list(range(0, 100))
rand = choice(l)

Imports#

Random is wat we noemen een library. Met het importeren van een library krijg te toegang tot alle functies die in deze library staan.

Optie 1:#

import random

random.choice(list(range(0, 10)))
random.randint(0,9)
random.uniform(0,9)

In deze optie wordt de hele library toegevoegd. Om de functies te gebruiken die in deze library staan, noteren we eerst uit welke library ze komen en dan volgt de functie naam. Zo onstaan er geen problemen als er meerdere libraries worden geimporteerd en er functie namen overeenkomen.

Optie 2:#

from random import choice
from random import randint
from random import uniform

choice(list(range(0, 10)))
randint(0,9)
uniform(0,9)

from random import choice importeert een hele specifieke functie uit de library en niet de hele library. Scheelt in de grootte van het programma. Is vooral handig om te gebruiken als je maar een enkele functie uit de libary wilt gebruiken.

Optie 3:#

from random import *

choice(list(range(0, 10)))
randint(0,9)
uniform(0,9)

from random import * importeert alle functies uit de library. Het is belangrijk om te weten welke functies dit zijn om te voorkomen dat er twee dezelfde functies in het programma staan. Bijvorbeeld van een andere library of in je eigen code.

Handige libraries#

math

  • cos()

  • sin()

  • tan()

  • sqrt()

  • pi

random

  • choice()

  • randint()

  • uniform()

time

  • time()

  • ctime()

Opdracht 1#

a. Wat is de ouput van onderstaande programma?

def main():
    """
    Main functie. Roept de andere functies op om hun werk te doen. 
    """
    print(dbl(21))
    print(dbl("wauw!"))

def testing():
    """
    Test functie. Hier staan alle assertions om de functies te testen.
    """
    assert dbl(21) == 42


def dbl(x):
    """
    Returns twice the argument
    :param x: The value to double
    :type x: int, float or string
    :rtype: int, float or string
    """
    return 2 * x

main()
testing()

b. Kopieer bovenstaande code in een nieuw bestand met de naam wk3wc1.py. Draai het programma om je antwoord bij a te checken.

c. Om de functie dbl() te testen kunnen we gebruik maken van assertions inplaats van prints. Op deze manier doet python al het testen voor ons. Een voorbeeld van een assertion staat in de functie testing. Voeg zelf nog twee andere assertions toe om de dbl functie te testen.

Met het gebruik van de main functie en test functie kunnen we de code overzichtelijk houden, vooral als straks het programma langer wordt. Het aansturen van het hele programma staat in de main functie en alle testen staan in de testing functie.

Signature en docstring#

De eerste regel van een functie wordt de signature genoemd. De signature van een functie bevat het keyword def (een afkorting van “define”), de naam van de functie, en een lijst met argumenten voor de functie tussen haakjes. Let op de dubbele punt waar de signature mee wordt afgesloten.

Direct onder de signature staat een string tussen drie dubbele aanhalingstekens """, dit heet een docstring (een afkorting van “documentation string”). We verwachten dat je in al je functies een docstring schrijft, zelfs in eenvoudige functies zoals dbl zodat dit een gewoonte voor jou wordt.

Een docstring moet de argumenten van de functie en het resultaat (de returnwaarde) beschrijven. Zoals je hierboven ziet kan je ook andere belangrijke informatie toevoegen. Docstring zijn de manier waarop jouw functies onderdeel worden van het ingebouwde hulpsysteem van Python.

De eerste driedubbele aanhalingstekens moeten ingesprongen worden direct onder de signatuur. De afsluitende driedubbele aanhalingstekens van de docstring springen op hetzelfde niveau en an alle volgende code binnen de functie (de functie “body”).

Opdracht 2#

Gegeven de functie interp(low, hi, fraction)

def interp(low, hi, fraction):
    return low + (hi - low) * fraction 

a. Wat is de doel van deze functie? Gebruik bij het antwoorden van deze vraag geen interpreter.
b. Kopieer deze functie naar je bestand. wk3wc1.py. Denk aan de locatie.
c. Voeg assertions toe in onze testing functie om je aanname bij a te testen.
d. Voeg een doctring toe.

Opdracht 3#

a.
Schrijf een functie convert_from_seconds(s) die als argumment een (niet negatieve) integer s accepteert en een lijst met vier (niet negatieve) integers teruggeeft die het aantal seconden in een meer gebruikelijke vorm beschrijft, zodat:

  • het eerste element het aantal dagen bevat

  • het tweede element het aantal uren bevat

  • het derde element het aantal minuten bevat

  • het laatste element het aantal seconden bevat

Je zal op het volgende moeten letten:

  • 0 ≤ seconden < 60

  • 0 ≤ minuten < 60

  • 0 ≤ uren < 24

Er is geen limiet op het aantal dagen. Een paar voorbeelden:

In : convert_from_seconds(610)
Out: [0, 0, 10, 10]

In: convert_from_seconds(100000)
Out: [1, 3, 46, 40]

Tips:

  1. Probeer, plan, programmeer. Voordat je meteen gaat programmeren, bedenk welke stappen nodig zijn om het probleem op te lossen.

  2. Zorg voor een docstring!

  3. Vergeet de assertions niet!

b.
Kopieer de volgende regel naar de main functie:

tijd = convert_from_seconds(100000)

Voeg code toe aan de main functie zodat de dagen, uren, minutes en seconde worden geprint. Voorbeeld output:
“1 dagen”
“3 uren”
“46 minuten”
“40 seconden”

Opdracht 4#

Schrijf een functie checkends(s) die als parameter een string s accepteert en True teruggeeft als het eerste karakter van s gelijk is aan het laatste karakter van s. Anders zal het False teruggeven. De functie checkends hoeft niet te werken met een lege string s (een string met waarde "").

De functie moet geen strings teruggeven! In plaats daarvan moet het een boolean teruggeven, dus True of False, zonder aanhalingstekens.

In de editor zul je zien dat booleans een andere kleur krijgen (in het standaardkleurenschema van VSCode worden ze blauw) om aan te geven dat Python ze herkent als waarden van het type bool. Als je er per ongeluk strings van hebt gemaakt ("True" in plaats van True) dan worden ze oranje in VSCode.

Voor alle duidelijkheid, booleans en strings zijn twee hele verschillende dingen! Voor True en False heb je vrijwel altijd de booleans, dus zonder aanhalingstekens, nodig.

In: checkends('niet gelijk')  
Out: False  

In: checkends('kijk! wel gelijk')  
Out: True  

In: checkends('q')  
Out: True  

In: checkends(' ')  
Out: True