Programmeren in Python/Functies
Wat zijn functies
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 moet schrijven.
Python heeft al veel ingebouwde functies zoals input()
en output()
, maar het is dus ook mogelijk om zelf functies te definiëren. Eens je een functie hebt gedefinieerd kun je die herhaaldelijk oproepen om te gebruiken.
Functies definiëren en oproepen
Eenvoudig voorbeeld
Om een functie te definiëren moet je het sleutelwoord def
gebruiken.
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 definieren 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 ()
is wat de functie laat uitvoeren.
Functie oproepen vanuit een andere functie
Het is perfect 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.
Referentie naar een functie doorgeven
Net zoals een variabel, is de naam van een functie een verwijzing naar data in het geheugen. In dit geval is de data code die moet worden uitgevoerd. Je kunt de referentie kopiëren naar een andere variabel en vanuit de variabel 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 variabel 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 referentie in variabel 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.
pass
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 een indented block, het mag dus niet leeg zijn. Als je het volgende zou uitvoeren krijg je een fout.
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 de statement pass
gebruiken als tijdelijk oplossing. pass
is een statement die 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
Eenvoudig voorbeeld
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 werken.
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
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 definiëert en net zoals variabelen kun je een naam slechts één keer gebruiken om een functie te definiëren. Als je toch een nieuwe functie definiëert 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 error. 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 twee parameters.
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 puntjes zullen we zien hoe je op andere manieren parameters en argumenten kunt gebruiken om flexibeler met functies te kunnen werken.
Standaard waarden
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 opriepen hebben we geen argument gegeven, dan wordt er aan de parameter de standaardwaarde gegeven en wordt die dan gebruikt.
U kunt een standaarwaarde instellen voor meerdere argumenten.
Willekeurig aantal argumenten
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
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
Het is mogelijk om gewone parameters, standaardwaarden, willekeurig aantal argumenten en argumenten via sleutelwoorden te combineren.
Return
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
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 lijn code, maar heeft als nadeel dat 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
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
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 lijn schrijven.
Een lambda functie kan slechts één enkele lijn code bevatten, en de structuur is de volgende:
<functienaam>=lambda <argument(en)>:<return value>
Eenvoudig voorbeeld
In onderstaand voorbeeld maken we een naamloze functie aan die één optel 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
Een lambda expressie kan als argument worden meegegeven wanneer een functie wordt opgeroepen. Hierdoor moet 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 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']