Programmeren in Python/Functies
Wat zijn functies?
[bewerken]Bij het schrijven van code, zul je merken dat je vaak dezelfde code schrijft om taken uit te voeren. Functies laten je toe stukjes code die je regelmatig gebruikt te hergebruiken zodat je ze maar één keer hoeft te schrijven. Daarnaast kun je functies ook gebruiken om lange code op te splitsen in functies die elk hun eigen probleem oplossen. Dit heeft verschillende voordelen, het kan bijvoorbeeld de leesbaarheid van de code vergroten, aangezien iedere functie één probleem oplost en duidelijk is wat iedere functie doet en als er een fout in de code is kun je makkelijker opzoeken waar de fout ligt en hoef je enkel de functie te verbeteren die de fout bevat.
Python heeft al veel ingebouwde functies zoals b.v. input()
en output()
, maar het is dus ook mogelijk om zelf functies te definiëren. Als je een functie hebt gedefinieerd kun je die bewaren herhaaldelijk oproepen om te gebruiken.
Functies definiëren, bewaren en oproepen
[bewerken]Eenvoudig voorbeeld
[bewerken]Om een functie te definiëren moet je het sleutelwoord def
gebruiken. Def staat in dit geval voor "definiëren".
Voorbeeld:
Python-code: mijn eerste functie
def my_first_function():
print("Dit is de code van mijn eerste functie.")
my_first_function()
Output:
Dit is de code van mijn eerste functie.
Zoals eerder gezegd moet je een functie definiëren met het sleutelwoord def
, dit moet gevolgd worden met een zelf te kiezen naam gevolgd door haakjes () en een dubbele punt :. De code voor de functie komt in een geïndenteerde blok.
Om een functie op te roepen moet je simpelweg de naam van de functie schrijven met de haakjes, dus my_first_function()
. De haakjes ()
zorgt ervoor dat de functie wordt uitgevoerd.
Functie oproepen vanuit een andere functie
[bewerken]Het is prima mogelijk om een functie op te roepen vanuit een andere functie.
Python-code: Functie oproepen vanuit een andere functie
def my_first_function():
print("Dit is de code van mijn eerste functie.")
my_second_function()
def my_second_function():
print("Dit is de code van mijn tweede functie, die ik heb opgroepen vanuit mijn eerste functie.")
my_first_function()
output:
Dit is de code van mijn eerste functie. Dit is de code van mijn tweede functie, die ik heb opgroepen vanuit mijn eerste functie.
Referenties naar een functie doorgeven
[bewerken]Net zoals een variabele, is de naam van een functie een verwijzing naar data in het geheugen. In dit geval is dat de data code die moet worden uitgevoerd. Je kunt de referentie kopiëren naar een andere variabele en vanuit die variabele de functie oproepen en laten uitvoeren.
Python-code: Referentie van een functie
def my_first_function():
print("Dit is de code van mijn eerste functie.")
function_in_variable = my_first_function
function_in_variable()
In dit voorbeeld, werd de referentie van de functie my_first_function
overgeplaatst naar de variabele function_in_variable
. Omdat de haakjes niet worden gebruikt wordt de functie niet uitgevoerd. Vervolgens wordt de functie wel uitgevoerd met function_in_variable()
vanwege het vermelden van de haakjes.
Naast de referenties in variabele te plaatsen, kun je referenties ook bijvoorbeeld in lijsten plaatsen.
Python-code: Referentie van een functie
def my_first_function():
print("Dit is de code van mijn eerste functie.")
def my_second_function():
print("Dit is de code van mijn tweede functie.")
def my_third_function():
print("Dit is de code van mijn derde functie.")
list_of_functions = [my_first_function, my_second_function, my_third_function]
for function in list_of_functions:
function()
Output:
Dit is de code van mijn eerste functie. Dit is de code van mijn tweede functie. Dit is de code van mijn derde functie.
Het gebruiken van pass
[bewerken]Soms kan het zijn dat je een functie wilt definiëren, maar dat je de code later wilt schrijven. Een functie moet echter code hebben in zijn geïndenteerde blok, het mag dus niet leeg zijn. Als je het volgende zou uitvoeren krijg je een foutmelding.
Python-code: pass
def my_function():
my_function()
Output:
File "test.py", line 4 my_function() ^ IndentationError: expected an indented block
Om dit te verhelpen kun je het statement pass
gebruiken als tijdelijke oplossing. pass
is een statement dat niets doet, enkel het verhelpen van de IndentationError en gebruik je als volgt.
Python-code: pass
def my_function():
pass
my_function()
Parameters en argumenten
[bewerken]Eenvoudig voorbeeld
[bewerken]Het is mogelijk om parameters in te stellen wanneer je een functie definieert. Met parameters kun je argumenten (bijvoorbeeld variabelen) meegeven wanneer je een functie oproept. De functie kan dan met die argumenten aan de slag.
Python-code: argumenten
# Voorbeeld van een functie met een parameter.
def hello_message(name):
print("Hallo " + name + "!")
hello_message("Geert")
hello_message("Jan")
hello_message("Klaas")
Output:
Hallo Geert! Hallo Jan! Hallo Klaas!
Eenvoudig voorbeeld met meerdere parameters
[bewerken]Het is mogelijk om een functie te definiëren met meerdere parameters. Je kunt daardoor dus meerdere argumenten doorgeven aan je functie.
Python-code: argumenten
# Voorbeeld van een functie met twee parameters.
def hello_message(first_name, last_name):
print("Hallo " + first_name + " " + last_name + "!")
hello_message("Geert", "Jansen")
Output:
Hallo Geert Janssen!
In dit voorbeeld zijn er dus twee parameters. Net zoals variabelen geef je een naam aan je functie wanneer je je functie definieert en net zoals bij variabelen kun je een naam slechts één keer gebruiken om een functie te definiëren. Als je toch een nieuwe functie definieert met dezelfde naam, zal de vorige functie worden overschreven. Als voorbeeld zullen we twee vorige voorbeelden combineren.
Python-code: argumenten
# Voorbeeld van een functie met een parameter.
def hello_message(name):
print("Hallo " + name + "!")
# Voorbeeld van een functie met twee parameters.
def hello_message(first_name, last_name):
print("Hallo " + first_name + " " + last_name + "!")
hello_message("Geert", "Janssen")
hello_message("Klaas")
Output:
Hallo Geert Janssen! Traceback (most recent call last): File "test.py", line 12 in <module> hello_message("Klaas") TypeError: hello_message() missing 1 required positional argument: 'last_name'
De eerste keer dat de functie hello_message()
werd opgeroepen waarbij we een voornaam en een achternaam als argumenten gaven was er geen probleem, de versie van de functie met twee parameters werd opgeroepen en correct uitgevoerd. De tweede keer toen we enkel de voornaam gaven kregen we een foutmelding. Dit komt dus omdat hij opnieuw de versie met twee parameters probeert uit te voeren. De versie met één parameter kan niet worden gebruikt omdat die werd overschreven door de tweede versie met slechts één parameter.
Een mogelijke oplossing is twee verschillende functies te definiëren, bijvoorbeeld hello_message_with_only_first_name()
en hello_message_with_first_and_last_name()
, maar dan definiëer je twee functies die eigenlijk hetzelfde doen. In de volgende voorbeelden zullen we zien hoe je op andere manieren parameters en argumenten kunt gebruiken om flexibeler met functies te kunnen werken.
Standaard waarden
[bewerken]U kunt voor de parameters standaard waarden bepalen, die u kunt gebruiken in de functie als er geen argument is meegegeven toen de functie werd opgeroepen en uitgevoerd. Dit doet u door naast de naam van de parameter een =
te schrijven gevolgd door een waarde. Dit kan een string zijn, een getal, etc...
Python-code: Standaardwaarden
# Voorbeeld van een functie met een parameter met een standaardwaarde.
def hello_message(name = "Gebruiker"):
print("Hallo " + name + "!")
hello_message("Geert")
hello_message()
Output:
Hallo Geert! Hallo Gebruiker!
In dit voorbeeld, hebben we eerst de functie opgeroepen met een argument die de waarde "Geert" heeft. De functie toonde dan het "Hallo bericht" met de naam "Geert". De tweede keer, toen we de functie opnieuw opriepen hebben we geen argument gegeven, dan wordt er aan de parameter de standaardwaarde gegeven en wordt die dan gebruikt. "Hallo Gebruiker".
U kunt een eenzelfde standaardwaarde instellen voor meerdere argumenten.
Willekeurig aantal argumenten
[bewerken]Soms kan het zijn dat je niet weet hoeveel argumenten je gaat meegeven wanneer je een functie oproept. Als je dit niet weet kun je een *
plaatsten voor de naam van de parameter.
Python-code: Willekeurig aantal argumenten
def hello_message(*names):
for name in names:
print("Hallo " + name + "!")
hello_message("Piet", "Jan", "Klaas", "Geert")
Output:
Hallo Piet! Hallo Jan! Hallo Klaas! Hallo Geert!
De argumenten die je doorgeeft komen in de functie terecht als een tuple, je zult die dan ook moeten verwerken als een tuple.
Argumenten met sleutelwoorden
[bewerken]Python-code: argumenten
def hello_message(name1, name2, name3):
print("Hallo {0}, {1} en {2}!".format(name1, name2, name3))
hello_message(name3="Piet", name1="Jan", name2="Klaas")
Output:
Hallo Jan, Klaas en Piet!
Combineren
[bewerken]Het is mogelijk om gewone parameters, standaardwaarden, willekeurig aantal argumenten en argumenten via sleutelwoorden te combineren.
Return
[bewerken]Tot nu toe hebben we met functies enkel simpele taken laten uitvoeren. Het handige aan functies is dat je het taken kan laten uitvoeren èn een resultaat kan laten terug geven. Dit kan met het sleutelwoord return
.
Eenvoudig voorbeeld
[bewerken]De volgende functie berekent de oppervlakte van een vierhoek en geeft het resultaat via het sleutelwoord return
terug.
Python-code: return
# functie om de oppervlakte van een vierhoek te berekenen
def surface(width, length):
result = width * length
return result
print("De oppervlakte van de vierhoek is: " + str(surface(10, 30)))
Output:
De oppervlakte van de vierhoek is: 300
Het is mogelijk om de expressie met de berekening rechtstreeks achter de return
te plaatsen. De functie zal dan de berekening uitvoeren en het resultaat rechtstreeks terug sturen. Hierdoor bespaar je een regel code, maar heeft als nadeel dat het de leesbaarheid van de code kan verminderen bij complexere expressies.
Python-code: return
# functie om de oppervlakte van een vierhoek te berekenen
def surface(width, length):
return width * length
print("De oppervlakte van de vierhoek is: " + str(surface(10, 30)))
Meerdere returns
[bewerken]Het is ook mogelijk om meerdere return
statements te gebruiken in één functie. Maar slechts één zal worden gebruikt, namelijk de eerste die de functie tegenkomt als het wordt gebruikt.
Python-code: return
# functie om de oppervlakte van verschillende vormen te berekenen
def surface(shape, *args):
if shape == "circle":
return args[0] ** 2 * 3.14
elif shape == "square":
return args[0] ** 2
elif shape == "rectangle":
return args[0] * args[1]
else:
return 0
print("De oppervlakte van de cirkel is: " + str(surface("circle", 10)))
print("De oppervlakte van de vierkant is: " + str(surface("square", 10)))
print("De oppervlakte van de vierhoek is: " + str(surface("rectangle", 10, 30)))
print("De oppervlakte van ... is: " + str(surface("...", 50, 50)))
Output:
De oppervlakte van de cirkel is: 314.0 De oppervlakte van de vierkant is: 100 De oppervlakte van de vierhoek is: 300 De oppervlakte van ... is: 0
Lambda expressies
[bewerken]Een lambda expressie is een naamloze of anonieme functie. Een lambda functie moet je niet definiëren met het sleutelwoord def
, je moet ze geen naam geven en kun je in één regel opschrijven.
Een lambda functie kan slechts één enkele regel code bevatten, en de structuur is de volgende:
<functienaam>=lambda <argument(en)>:<return value>
Eenvoudig voorbeeld
[bewerken]In onderstaand voorbeeld maken we een naamloze functie (lambda) aan die één optelt aan het argument x.
Python-code: lambda
add_one = lambda x: x + 1
print(add_one(5))
Output:
6
Het sleutelwoord lambda wordt gebruikt om aan te geven dat we een lambda expressie gebruiken om een naamloze functie te definiëren.
Lambda expressie als argument van een functie
[bewerken]Een lambda expressie kan als argument worden meegegeven wanneer een functie wordt opgeroepen. Hierdoor hoef je geen aparte functie nog definiëren. Dit is vooral handig als je het maar éénmalig nodig hebt. In onderstaand voorbeeld hebben we een lijst met verschillende namen, die we sorteren met de ingebouwde methode sort()
. In normale omstandigheden zal sort
, de namen alfabetisch sorteren. De sort()
methode heeft een optionele parameter genaamd key, die we kunnen gebruiken om een alternatieve manier van sorteren te bepalen. We gebruiken deze parameter om een lambda als argument mee te geven. Als lambda expressie geven we het volgende mee, lambda x: len(x)
. Hier staat x voor een naam in de lijst. Met de ingebouwde functie len()
geven we het aantal tekens dat de naam heeft terug. De sort()
methode zal dan dit gebruiken als sleutel om te weten hoe hij de namen moet sorteren.
Python-code: Lambda expressie
# Een lijst met namen.
names = ['Piet', 'Jan', 'Klaas']
# Voorbeeld van het gebruik van sort().
names.sort(key = lambda x: len(x))
# Uitprinten van de namen. Zoals je zult zien zijn de namen nu gesorteerd op het aantal tekens in de naam
print(names)
Output:
['Jan', 'Piet', 'Klaas']
Recursieve functies
[bewerken]Recursieve functies zijn functies die zichzelf telkens weer opnieuw oproepen om een bepaalde bewerking te doen tot er aan een bepaalde voorwaarde is voldaan. Onderstaand voorbeeld is een recursieve functie die aftelt van een bepaald getal tot nul.
Python-code: Recursieve functies
def count_down_from_number(number):
print(number)
if number > 0:
count_down_from_number(number-1)
count_down_from_number(10)
Output:
10 9 8 7 6 5 4 3 2 1 0
In bovenstaand voorbeeld hebben we een functie gedefiniëerd genaamd count_down_from_number()
met als parameter een getal waarmee we starten met aftellen. Het print eerst het getal en zolang het getal groter is dan nul, roept de functie zichzelf op met als argument het getal min één. De functie zal dan blijven worden opgeroepen tot het getal nul geworden is en stopt dan ook de recursie.
In theorie kan een functie zich in het oneindige zichzelf oproepen, maar in Python gaat dit niet. Python zal na verloop van tijd zelf een recursie afbreken als het te vaak gebeurd.
Recursie kan ook gebruikt worden om de rij van Fibonacci te berekenen.
Python-code: Recursieve Fibonacci functie
def fibonacci(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fibonacci(n-1)+fibonacci(n-2)
print(fibonacci(10))
Output: Dit programma drukt dus het 11e (10 +1) getal van de reeks van Fibonacci (=55) af.
55