We weten reeds dat in algoritmisch denken we een probleem gaan opdelen in kleinere problemen. In de praktijk wilt dit zeggen dat we onze "hoofd-script" gaan opdelen in verschillende deelscripten die onafhankelijk uitgewerkt en getest worden.
Eenmaal men zeker is dat dit deel-script werkt, wordt dit ingevoegd in het hoofdscript. Dit deelscript wordt dan een functie van het "hoofd-script"
Belangrijk wel is dat afgesproken wordt welke data er moet uitgewisseld worden tussen de functie (deelscript) en het hoofdscript. Dit gebeurt via argumenten die toegewezen worden aan parameters en de retour waarde.
Let wel, er kan data uitwisseling zijn tussen het hoofdscript en de functie, maar dit moet niet.
Voorbeeld 1:
In het voorbeeld hiernaast wordt met de int( )-instructie vanuit het hoofdprogramma de waarde 1.54 uitgewisseld met de int( ) -functie.
De int( )-functie gaat met deze data iets doen, namelijk er een geheel getal van maken.
En geeft deze waarde retour aan het hoofdscript. Hierdoor wordt de waarde 1 toegewezen aan x.
Voorbeeld 2:
In het voorbeeld hiernaast wordt met de print( )-instructie vanuit het hoofdprogramma "Hello" uitgewisseld met de print( ) -functie.
De print( )-functie gaat met deze data iets doen, namelijk op het scherm tonen.
Maar de print-instructie geeft geen retourwaarde.
Voorbeeld 3:
In het voorbeeld hiernaast wordt met de print( )-instructie vanuit het hoofdprogramma niets uitgewisseld met de print( ) -functie.
De print( )-functie krijgt geen data maar gaat wel iets doen, namelijk naar de volgende lijn gaan.
En de print-instructie geeft weer geen retourwaarde.
We hebben reeds in deel 1 functies behandeld.
Enkele voorbeelden zijn:
str( ): om data om te zetten naar een string
int( ): om data om te zetten naar een geheel getal
print( ): om output op het scherm te krijgen
input( ): om input van de gebruiker te vragen
Dit zijn allemaal standaard functies die ingebouwd zijn in Python.
Heb je functies nodig die niet standaard aanwezig zijn, dan zou het wel eens kunnen zijn dat je een bibliotheek kan importeren die deze functies bevat: bibliotheek functies
In deel 1 van de Python cursus hebben reeds bibliotheekfuncties behandeld uit de math- en random-bibliotheek
math.sqrt( ): berekent de vierkantswortel
random.randint( ): geeft een willekeurig geheel getal tussen twee aangegeven waarden
Kom je hier nog steeds niet mee toe? Dan kan je zelf functies gaan definiëren.
Een functie heeft:
een naam die moet voldoen aan dezelfde voorwaarde als de naam van een variabele
kan parameters hebben (maar is niet noodzakelijk)
kan een retour waarde geven
Wanneer we zelf een een functie gaan creëren, dan moet je al deze dingen definiëren.
De algemen structuur van een functie ziet er zo uit:
def <functienaam> (<parameterlijst>):
<acties>
return <waarde> #als het een functie is met een retour waarde.
Wanneer je de functie wilt gebruiken, dan ga je die moeten aanroepen.
Heeft de functie geen retour waarde dan is dit gewoon met de functienaam
<functienaam>(<parameters>)
De haakjes moeten er staan, ook als je geen parameters meegeeft.
Geeft de functie een retourwaarde, dan moeten we die gaan gebruiken in een formule of toewijzen aan een variabele
<variabele naam> = <functienaam>(<parameters>)
Ook hier moeten de haakjes er altijd staan, ook als er geen parameters meegegeven worden.
Als je een functie aanroept, dan moet Python de functie al wel "gezien" hebben. Ze moet dus voor de aanroep staan.
Hoewel het is toegelaten om voor de functie-definitie een deel van het hoofdscript te schrijven, is dit geen goede praktijk.
Om een leesbaar programma te houden worden functies daarom gedefinieerd juist na het impoteren van biblioteken.
Voorbeeld 1:
Je wilt op verschillende plaatsen in een programme eerst vragen of de gebruiker echt wel wilt stoppen. De gebruiken moet dan met j of n antwoorden, maar uit ervaring weet je dat dit niet steeds gebeurt. Je wilt dus alle mogelijke manieren bekijken om ja of nee te antwoorden.
Het hoofdscript wilt weten of er het antwoord j of n is. In overleg wordt verwacht dat de retour waarde True is bij n en False bij j.
Deelscript
stoppen = False
antwoord = input("Wil je stoppen? (j/n) ")
while antwoord not in ["Ja","Nee","ja","nee","j","n","J","N"]:
antwoord = input("Wil je stoppen? (j/n) ")
if antwoord in ["Ja","ja","j","J"]:
print("In orde. Tot ziens.")
stoppen = True
#resultaat tonen
print(stoppen)
Deelscript omzetten naar functie:
def einde():
stoppen = False
antwoord = input("Wil je stoppen? (j/n) ")
while antwoord not in ["Ja","Nee","ja","nee","j","n","J","N"]:
antwoord = input("Wil je stoppen? (j/n) ")
if antwoord in ["Ja","ja","j","J"]:
print("In orde. Tot ziens.")
stoppen = True
Je kan nu op verschillende plaatsen in je programma deze code gaan toepassen, simpel door de instructie aan te roepen.
Dit wordt in onderstaande code op 2 plaatsen zo gedaan (in het vet gedrukt).
totaal = 0
stop = False
teller =0
while not stop:
invoer = input("Geef getal in: ")
if invoer =="":
stop=einde() #aanroepen functie
if not stop:
print("Ok, geef dan een getal in")
else:
totaal = totaal + float(invoer)
print("De som is",totaal)
teller = teller +1
print()
print("Je totaal van",teller,"getallen is",totaal)
print("Ik kan stoppen of het gemiddelde berekenen")
if not einde(): #aanroepen functie
print("Het gemiddelde van alle getallen is",totaal/teller)
Bekijk de uitvoering van script.
De pijlen duiden aan wanneer de functie is uitgevoerd.
Oppervlakte bol
Schrijf een functie die voor een gegeven straal het oppervlak van een bol berekend.
Mogelijke oplossing
from math import pi
def opp_bol(r):
return 4*pi*r**2
#Hoofdscript met een voorbeeld van het gebruik van de functie
straal = float(input("Geef de straal van de bol: "))
print("De bol heeft een oppervlak van",opp_bol(straal))
Priemgetal
Schrijf een functie die aangeeft of een gegeven waarde een priemgetal is of niet.
Mogelijke oplossing
#functie priemgetal
def priemgetal(getal):
teller = 2
while teller<=getal**.5 and getal%teller!=0:
teller+=1
if teller >=getal**.5:
print("Dit is een priemgetal")
else:
print("Dit is geen priemgetal")
#Hoofdscript met een voorbeeld van het gebruik van de functie
priemgetal(6337)
Faculteit
Schrijf een functie die de faculteit van een getal berekent
Mogelijke oplossing
#functie faculteit - niet recursief
def fac(n):
result=1
for i in range(1,n+1):
result=result*i
return result
#hoofdscript
print(fac(5)) # 5! = 120
print(fac(2)) # 2! = 2