4. Datatypes#

In het Nederlands heeft het woord data twee betekenissen:

  1. Meervoud van datum.
    ‘Er zijn twee data geschikt voor het feestje.’

  2. Gegevens, informatie.
    ‘De data wordt opgeslagen in de cloud.’

Bij computerprogrammeren gebruiken we data vrijwel altijd in de betekenis van gegevens, informatie. Voorbeelden van data waarmee computerprogramma’s werken zijn:

  • De nickname van een gebruiker.

  • De positie van een figuurtje in een game.

  • Het aantal seconden dat verstrijkt voordat een gebruiker een reclame kan wegklikken.

  • De geboortedatum van een gebruiker.

Het laatste voorbeeld laat zien dat een datum ook data kan zijn.

Wat leer je in dit hoofdstuk
  • Wat bedoelen we met een datatype.

  • Welke datatypes voor getallen en tekst zijn er in Python.

  • Hoe kun je het datatype van een waarde opvragen in Python.

  • Hoe kun je een waarde van het ene datatype naar het andere datatype converteren met type casting.

Getallen en tekst#

Probeer het volgende eens uit in de CLI:

>>> 2 + 3
...
>>> '2' + '3'
...

Wat geeft Python als antwoord terug op deze berekeningen?

Resultaat - pas openen nadat je het zelf hebt geprobeerd
../_images/num_or_str_cli.png

Waarden die tussen aanhalingstekens staan, herkent Python als tekst. Aanhalingstekens kwam je eerder tegen in het Hello, World! programma:

print('Hello, World!')

In de code '2' + '3' behandelt Python de waarden 2 en 3 dus niet als getallen, maar als tekst. En je zag dat het optellen van tekst een ander resultaat geeft dan het optellen van getallen; Python plakt de tekst aan elkaar:

../_images/str_addition_cli.png

Wat zou er gebeuren als je probeert een getalswaarde bij een tekstwaarde op te tellen, bijvoorbeeld 2 + '3' ? De beste manier om daar achter te komen is het gewoon te proberen:

../_images/type_error.png

Python geeft een foutmelding: TypeError: unsupported operand type(s) for +: 'int' and 'str'. Omdat het type van de eerste waarde (getal) niet overeenkomt met het type van de tweede waarde (tekst), kan Python de optelling niet uitvoeren en meldt een TypeError.

Integer, float en string#

Met getallen kun je andere dingen doen dan met tekst. Getallen en tekst zijn twee verschillende soorten data. Zelfs getallen onderling kunnen van een verschillend type zijn. Met de functie type() kun je in Python het datatype van een waarde opvragen. Typ de volgende regels maar eens in de CLI en bekijk het resultaat.

>>> type(42)
...
>>> type(42.0)
...
>>> type('42')
...
>>> type('42.0')
...
Resultaat - pas openen nadat je het zelf hebt geprobeerd
../_images/type_function.png

Python kan werken met een grote verscheidenheid aan datatypes, maar vooralsnog beschouwen we de volgende drie:

Datatype

Naam

Waarde

int

integer

geheel getal

float

floating point number

getal met decimalen

str

string

tekst

Je ziet dat Python twee soorten getallen onderscheidt: gehele getallen en kommagetallen. De eerste heten in Python integers en de laatste floats. En je hebt vast al opgemerkt dat je kommagetallen in Python niet met een komma schrijft, maar met een punt: 42.0.

Resultaten van Berekeningen#

In het hoofdstuk Berekeningen in de CLI zag je dat de berekening 345 / 23 het resultaat 15.0 opleverde.

>>> 345 / 23
15.0

Blijkbaar levert een deling van twee integers in Python altijd een float op, zelfs als de uitkomst eigenlijk een mooi rond getal is. Je kunt de geheeltallige deling // gebruiken om een (naar beneden afgeronde) integer te krijgen:

>>> 345 / 23
15.0
>>> 345 // 23
15

Hoe zit het met de datatypes bij andere berekeningen zoals optellen, aftrekken en vermenigvuldigen? Wanneer je twee integers optelt, is het resultaat ook een integer. Maar wanneer je een integer en een float optelt, is het resultaat een float.

Berekening

Resultaat

int + int

int

int + float

float

float + float

float

Probeer zelf eens te bedenken waarom dat zo is, en hoe het werkt bij aftrekken en vermenigvuldigen.

Type casting#

Helaas is de data waarmee een computerprogramma moet werken niet altijd meteen van het juiste type. Soms ontvangt je code (van de gebruiker of vanuit andere code) een stringwaarde terwijl je een integer nodig hebt. Of er komt een float binnen terwijl je juist een string had willen hebben. In dat geval is het handig als je de waarde kunt converteren naar een ander datatype. Dat noemen we type casting.

Voor de datatypes int, float en str heeft Python de type casting functies int(), float() en str().

../_images/type_casting.png

In bovenstaand voorbeeld zie je dat float(42) de floating point versie teruggeeft van de integer 42. Net zo geeft str(42) de string '42' terug.

Opdrachten#

Opdracht 01

Probeer het resultaat te voorspellen van de volgende type() aanroepen, en check vervolgens je voorspelling in de CLI.

  1. type('Hello, World!')

  2. type(12345)

  3. type(3.1415927)

  4. type('1.618')

Opdracht 02

In plaats van één waarde, kun je tussen de haakjes bij type() ook een berekening typen. Bijvoorbeeld type(2 + 3). Python geeft dan het datatype van het resultaat van de berekening.

Probeer te voorspellen hoe Python reageert op de volgende type() aanroepen, en check vervolgens je voorspelling in de CLI. Kun je de verschillen verklaren tussen de resulterende datatypen van de vijf berekeningen?

  1. type(12 + 3)

  2. type(12 + 3.0)

  3. type(12 * 3)

  4. type(12 / 3)

  5. type(12 // 3)

Opdracht 03

Type casting werkt alleen als Python de ingevoerde waarde logisch kan omzetten naar een ander datatype. Wanneer dat niet kan, krijg je een foutmelding. Probeer in de CLI de onderstaande type casts uit te voeren en bedenk van tevoren of het zal werken.

  1. de float 42.0 naar een integer.

  2. de float 42.0 naar een string.

  3. de string '42.0' naar een float.

  4. de string '42.0' naar een integer.

  5. de string '42' naar een float.

  6. de string '42' naar een integer.

  7. de string 'Hello, World!' naar een integer.

  8. de string 'Hello, World!' naar een float.

Antwoorden#

Antwoord opdracht 01
  1. string (<class 'str'>)

  2. integer (<class 'int'>)

  3. float (<class 'float'>)

  4. string (<class 'str'>)

Antwoord opdracht 02
  1. integer (<class 'int'>)

  2. float (<class 'float'>)

  3. integer (<class 'int'>)

  4. float (<class 'float'>)

  5. integer (<class 'int'>)

Antwoord opdracht 03
  1. int(42.0) levert 42

  2. str(42.0) levert '42.0'

  3. float('42.0') levert 42.0

  4. int('42.0') levert ValueError

  5. float('42') levert 42.0

  6. int('42') levert 42

  7. int('Hello, World!') levert ValueError

  8. float('Hello, World!') levert ValueError