# Programmeren in Python/Variabelen en gegevens

In dit hoofdstuk wordt besproken wat variabelen zijn en welk soort gegevens of data ze kunnen bevatten.

## Wat is een variabele?

Een variabele is een verwijzing naar een plaats in het geheugen van de computer waar je gegevens hebt opgeslagen. Met die gegevens kun je allerlei dingen doen. Je kunt de gegevens gebruiken en hergebruiken om bijvoorbeeld er bewerkingen mee te doen, zoals een wiskundige berekening. Je kunt de gegevens ook aanpassen, vervangen en verwijderen.
Variabelen kunnen verwijzen naar allerlei soorten data, van simpele tekst en getallen, tot complexere data met allerlei eigenschappen. Om te kunnen werken met variabelen geven we ze een naam, als we dan iets willen doen met de gegevens waarnaar de variabele verwijst roepen we gewoon zijn naam op.

## Een variabele gebruiken

We bekijken een eerste voorbeeld van een programma dat een variabele gebruikt. In het volgend voorbeeld maken we een variabele aan genaamd name en zetten er gegevens in.
Python-code: Variabele
Output:
Waarom staan er apostroffen (') rond Ada's naam, en aanhalingstekens (") rond "Tot ziens"? Beide tekens worden gebruikt om een tekenreeks af te bakenen. Die tekenreeks wordt hier in de variabele met de naam name gestopt. In Python mogen we zowel ' als " gebruiken om tekenreeksen af te bakenen, maar u mag ze niet zomaar met elkaar combineren. Wat bijvoorbeeld verboden is, is een tekenreeks zoals deze: 'Begint met apostrof en eindigt met een aanhalingsteken". Bovendien zien we hier ook hoe Python toestaat om twee tekenreeksen aan elkaar vast te plakken: gebruik gewoon een plusteken (+) om de reeksen samen te voegen.

## Invoer van gegevens

Een variabele kan ook gegevens bevatten die van buiten het programma komen. Eén van de manieren om gegevens van buiten het programma te krijgen is via het toetsenbord, daarvoor kun je de functie input gebruiken.
Python-code: input
Output:
input is net zoals print een ingebouwde functie. Het vraagt naar invoer via het toestenbord van jou, de gebruiker van het programma. Telkens als je het programma uitvoert kun je een andere naam invoeren. Die naam komt in de variabele met de naam name terecht en kan verderop in het programma gebruikt worden, bijvoorbeeld om een welkomstbericht op het scherm af te drukken. Bovenstaand stukje code kan nog iets netter worden geschreven. Net zoals bij print, kun je bij input een argument meegeven.
Python-code: input
Output:
Nu zie je wel dat wanneer je tekst invoert dat het rechtstreeks achter "Voer uw naam in alstublieft:" komt in tegenstelling tot print. Dit komt omdat als u print gebruikt er na de tekst automatisch een nieuwe regel wordt begonnen. Bij input gebeurt dit ook, maar pas nadat u tekst hebt ingevoerd, daardoor komt de invoer op dezelfde regel als "Voer uw naam in alstublieft:" .
Merk op dat invoer ook van een API URL call kan komen:
Python-code: input
Output:

## Getallen

Je kunt ook getallen in variabelen stoppen.
Python-code: Getallen
Output:

## Tekst en getallen

Je kunt tekst en getallen combineren en samen gebruiken, maar niet zomaar. In het volgend voorbeeld zullen we een getal samenvoegen aan een tekst.
Python-code: Getallen
Output:
We krijgen een error of in het Nederlands een fout en meer specifiek een TypeError. Wanneer je tekst wilt combineren met een getal, wordt er eigenlijk meer tekst verwacht. Om dit probleem te verhelpen kunnen we een functie gebruiken, namelijk de functie str. Met de functie str kunnen we getallen laten omzetten in tekst. Deze functie heeft een parameter waar je een variable kunt meegeven als argument aan de functie. Vervolgens zet de functie het om in tekst en geeft het terug zodat je het kunt gebruiken in je programma. Je gebruikt het bijvoorbeeld als volgt.
Python-code: Getallen
Output:

## Naamgeving

Je bent vrij te kiezen welke naam je geeft aan een variabele, maar je moet je wel aan een aantal regels houden:
* Je mag letters, getallen en underscores (_) gebruiken in de naam voor je variabelen.
* De variabelenaam mag echter niet beginnen met een getal, dus 9number mag niet maar wel number9.
* Speciale tekens zoals @ en spaties kunnen ook niet worden gebruikt.
* Python heeft ook een aantal gereserveerde woorden die niet mogen worden gebruikt als variabelenaam.
Daarnaast geeft Python nog een paar richtlijnen:
* De namen kunnen geschreven worden in lowercase (kleine letters) met underscores tussen woorden. Dus bijvoorbeeld variable_name en dus niet VariableName.
* Geef liefst Engelstalige namen aan je variabelen. Je moet er altijd vanuit gaan dat je code kan worden gelezen door iemand die geen Nederlands spreekt. Gebruik dus enkel Nederlandstalige namen voor je variabelen als je absoluut zeker bent dat niemand anders de code gaat lezen.
* Gebruik namen die de variabelen goed omschrijven. Gebruik nooit de letters 'O' (hoofdletter o), 'l' (kleine letter l) of 'I' (hoofdletter i) aangezien deze soms kunnen worden verward met 1 (één) of 0 (nul).
Bovenstaande richtlijnen zijn niet verplicht, dus als je de regels niet volgt zal het script nog steeds werken. Het kan wel zijn dat je IDE een waarschuwing geeft.

## Datatypes

Tot nu toe hebben we twee soorten gegevens gezien, tekst en getallen. Het datatype voor tekst noemt men in Python str ofwel string. Voor getallen zijn er drie types, namelijk int(integer), float en complex. Hieronder is een lijst gegeven van alle ingebouwde datatypes. Er wordt in de volgende hoofdstukken dieper op ingegaan wat die datatypes zijn en hoe ze te gebruiken.
| Datatype | Soort |
| str(string) | Tekst |
| int | Numeriek |
| float | Numeriek |
| complex | Numeriek |
| list | Reeks |
| tuple | Reeks |
| range | Reeks |
| dict(dictionary) | Map |
| set | Set |
| frozenset | Set |
| bool | Boolean |
| bytes | Binair |
| bytearray | Binair |
| memoryview | Binair |

## Type Hinting

In tegenstelling tot vele andere programeertalen kun je in Python niet expliciet zeggen welk soort datatype een variabele moet bevatten. Een variabele kan dus zowel een str als een int zijn, wat toch wel twee verschillende soorten datatypes zijn. Dit kan serieuze gevolgen hebben als je bijvoorbeeld bij een variabele een int waarde geeft, om later in je script het als een str te gebruiken of omgekeerd.
Stel we hebben de variabele day, month, year om in onze code een datum te omschrijven. Bij day en year kun je er redelijk van uitgaan dat we getallen gaan gebruiken, maar wat met month? Gaan we 4 gebruiken of het woord april? Misschien heb je de rest van je code zo geschreven dat het eigenlijk niets uitmaakt, maar misschien ook niet. Als het toch een verschil zou uitmaken kun je type hinting gebruiken. Bijvoorbeeld als volgt:
Python-code: Type hinting
Type hinting doe je door de naam van de variable te schrijven, gevolgd door een dubbele punt(:), met daarachter het verwachte datatype. Door aan Type hinting te doen geef je, zoals de naam ook aangeeft, enkel een hint van wat het datatype zou moeten zijn van de waarde die we in een variabele stoppen. We kunnen nog steeds een ander datatype in onze variabele stoppen. Type hinting is vooral handig wanneer we het gebruiken in combinatie met een IDE, die kunnen dan tijdens het programmeren waarschuwingen geven als we een variabele incorrect gebruiken. Het is dus prima mogelijk om het volgende te doen:
Python-code: Type hinting
Het script zal nog steeds werken wanneer we andere soorten datatypes in de variabelen stoppen dan er wordt aangegeven door de hint. Natuurlijk als we later in het script de variabelen gebruiken op een manier dat niet passen met de datatypes kan Python een Error geven.
Type hinting is redelijk nieuw in Python en wordt pas ondersteund vanaf Python 3.5, houd er dus rekening mee dat dit niet werkt in oudere versies van Python.

## Referenties

Zoals eerder vermeld, verwijst of refereert een variabele naar een plaats in het geheugen van de computer. Om te weten naar welke plaats in het geheugen wordt verwezen kun je de ingebouwde functie id gebruiken. Bijvoorbeeld als volgt:
Python-code: Getallen
output:
Dit stukje code heeft een variabele a met als waarde 5. Als de we de ingebouwde functie id gebruiken en het resultaat afdrukken met print kregen we hier als resultaat 140709229395136. De referentie kan verschillen van computer tot computer (dus houd er rekening mee dat deze code een andere output kan hebben op jouw computer), maar het kan ook veranderen telkens wanneer je het stukje code opnieuw draait. Er zijn echter ook uitzonderingen. Neem nu het volgende stukje code, dat we twee keer zullen uitvoeren.
Python-code: Getallen
eerste ouput:
tweede ouput:
Zoals je kunt zien heeft de variabele a twee keer dezelfde referentie, maar variabele b en c verschillende. Dit komt omdat Python voor sommige waardes standaard een plaats reserveert en altijd dezelfde plaats gebruikt. Terwijl andere variabelen telkens een andere plaats kunnen krijgen. Maar Python gaat hier nog een stapje verder in, met hoe het omgaat met het geheugen van de computer. Als Python merkt dat twee variabelen dezelfde waardes bevat kan het zijn dat, hoewel die variabelen apart gedeclareerd zijn en aparte waardes hebben gekregen, ze toch naar dezelfde plaats in het geheugen verwijzen. Bijvoorbeeld:
Python-code: Getallen
output:
Zoals je kunt zien hebben variabelen a en b dezelfde referentie, net zoals c en d.

## Nieuwe functies

* input
* str