Python functies

Op deze pagina:

Het definiëren van eigen functies is een essentiële vaardigheid voor het schrijven van heldere en effectieve code. Het voornaamste doel van een functie is om je in staat te stellen de code erin te hergebruiken wanneer je deze nodig hebt, indien nodig met verschillende invoer.

Je kunt een functie zien als een subprogramma. Het hoofdprogramma roept het subprogramma aan en verzendt informatie die het subprogramma nodig heeft tijdens de uitvoering. Wanneer de functie al zijn acties voltooit, kan het gegevens terugsturen naar het hoofdprogramma dat het heeft aangeroepen.

Volgens de stijlgids van Python PEP 8 moet een functie een naam krijgen met kleine letters en moeten woorden gescheiden worden door een onderstrepingsteken (underscore), bijvoorbeeld: doe_iets(). Je moet haakjes toevoegen achter de functienaam wanneer je deze aanroept.

De structuur van een functie:


def functienaam(parameters):
    """
    omschrijving in een docstring
    """
    functies-instructies
    return waarde(n)

In een definitie van een functie is het niet verplicht om parameters op te geven, de haakjes mogen leeg zijn, dan heb je een functie zonder parameters.

Variabelen in functies zijn lokaal en niet zichtbaar buiten de functie.

Als je een globale variabele in een functie wil aanpassen, dan moet je de global opdracht in de functie gebruiken met die variabele:


algemeneVariabele = 99

def mijnfunctie():
    global algemeneVariabele
    algemeneVariabele = 100

In het bovenstaande voorbeeld zal de waarde van algemeneVariabele 100 worden na het aanroepen van mijnfunctie().

Het op deze manier gebruiken van globale variabelen is geen goede gewoonte. Het kan ertoe leiden dat verschillende functies wijzigingen aanbrengen in dezelfde gegevensstructuur, wat kan leiden tot bugs die moeilijk te vinden zijn.

Als er geen return opdracht is, dan geeft de functie de waarde None terug. None is de afwezigheid van een waarde. Een functie geeft een object terug, dat hoeft geen enkelvoudige waarde te zijn, maar kan bijvoorbeeld ook een tuple zijn.

Argumenten vs Parameters

Parameters hebben nog geen waarden. De parameternamen worden gebruikt in de code binnen de functiedefinitie. Wanneer je de functie aanroept, geef je argumenten tussen haakjes door, één voor elke parameter. Een argument is een waarde die je aan de functie doorgeeft.Je zult soms parameters tegenkomen die formele parameters worden genoemd en argumenten die werkelijke parameters worden genoemd.

Verplichte en optionele argumenten

Als je tussen de haakjes van een functiedefinitie argumenten plaatst, dan zijn deze verplicht bij de aanroep van de functie.

Je kunt argumenten optioneel maken door ze in de functiedefinitie een defaultwaarde mee te geven.


def mijnfunctie(mijnvar=25):
    print(mijnvar)

In het bovenstaande voorbeeld kun je de functie mijnfunctie() aanroepen zoder parameter tussen de haakjes te plaatsen, mijnvar zal dan de waarde 25 bevatten. Als je wel een waarde meegeeft tussen de haakjes van de functie aanroep, dan zal mijnvar deze via de aanroep meegegeven waarde krijgen.

Bij meerdere argumenten in een functiedefinitie, moeten de argumenten die een defaultwaarde mee krijgen, de optionele argumenten dus, als laatste staan, er mogen geen verplichte argumenten meer volgen.

Mutable argumenten

Lijsten (lists) en dictionaries zijn mutable. Wanneer je deze als argument meegeeft aan een functie defitie, dan zal de globale variabele aangepast worden door de functie.

Wanneer je een list of dictionary als optioneel argument aan een functie definitie meegeeft, dan zal als de list of dictionary al bestaat, deze worden aangepast door de functie. Om een list of dictionary, als optioneel argument, leeg in een functie te krijgen, zul je deze in de functie leeg moeten maken.

Vermijd het gebruik van een mutable gegevenstype als defaultwaarde bij het definiëren van een functie met optionele parameters.

Args en Kwargs

Als je meer optionele argumenten nodig hebt, kun je meer parameters met standaardwaarden maken bij het definiëren van de functie.

Het is echter mogelijk om een ​​functie te definiëren die een onbeperkt aantal optionele argumenten accepteert. Je kunt zelfs functies definiëren die een willekeurig aantal keywoordargumenten accepteren. Keywoordargumenten zijn argumenten waaraan een keywoord en een waarde zijn gekoppeld.

Een functiedefinitie die een variabel aantal invoerargumenten bevat met behulp van args kan er zo uitzien:


def dingen_toevoegen(dingenlijst, *args):
    print(*args)

Meestal wordt de naam args gebruikt voor optionele argumenten, maar dat hoeft niet, het is slechts een naam. Het is de voorgaande * (de unpacking operator) die deze parameter zijn specifieke eigenschappen geeft. Je mag hier dus ook een andere naam aan geven, zolang het sterretje er maar voor staat.

De optionele parameters worden in een tuple gezet die je in de functie zelf kan unpacken met * als unpacking operator.

Wanneer je args aan een functiedefinitie toevoegt, voeg je ze meestal toe na alle vereiste en optionele parameters, alleen keyword argumenten in de vorm van kwargs kunnen er nog na komen.

Als je keywordargumenten gebruikt, hoef je de argumenten niet meer in te voeren in de volgorde waarin ze zijn gedefinieerd.

Bij het definiëren van een functie kun je een willekeurig aantal optionele keywordargumenten opnemen met behulp van kwargs, wat staat voor keywordargumenten.

Voorbeeld:


def dingen_toevoegen(dingenlijst, **kwargs):
    print(**kwargs)

De parameternaam kwargs wordt voorafgegaan door twee sterretjes (**).

De dubbele ster of asterisk werkt op dezelfde manier als de enkele asterisk die je gebruikt om items uit een reeks uit te pakken. De dubbele ster wordt gebruikt om items uit een mapping uit te pakken. Een mapping is een gegevenstype met gepaarde waarden als items, zoals een dictionary.

De naam kwargs is niet verplicht, net zoals bij args is het slechts een naam, het zijn de dubbele sterretjes die voor de werking zorgen.

Type Annotaties

Python is een dynamically typed programmeertaal. Je hoeft het type variabele, functie patameter of functie return waarde niet te specificeren.

Met annotaties kun je dat optioneel toch doen.


# een functie zonder annotaties

def verhogen(x):
    return x + 1

# een functie met annotaties

def verhogen(x: int) -> int:
    return x + 1

Je kunt annotaties ook toepassen op variabelen:


teller: int = 0

Python doet zelf niets met deze annotaties. Zelfstandige gereedschappen zoals mypy en IDE's zoals VS Code of PyCharm kunnen dit wel gebruiken om je code te controleren op fouten.

 

Verwante artikelen