04: Types

Vanaf deze les, hebben voorbeelden en programma-invoervensters extra knoppen: Open in the console en VisualiseerGebruik ze om het programma te verbeteren en te onderzoeken.

In het Hello, World!-programma zagen we dat Python in staat is om een tekenreeks (een stuk tekst) voor ons te herhalen. We hebben ook meerdere rekenvoorbeelden met getallen gezien. Getallen en tekenreeksen zijn fundamenteel verschillende soorten waarden, en wanneer je ze op de verkeerde manier in Python door elkaar gebruikt kan dat een foutmelding tot gevolg hebben:

Voorbeeld
Dit programma probeert een tekenreeks met een getal te vergelijken.

Zoals je kunt zien, krijgen we een foutmelding waarin wordt aangegeven dat de twee argumenten van max van verschillende types zijn. De foutmelding is een goede inleiding tot de rest van de les:

  • "Hello, World!" is een tekenreeks (Eng.: string), die door Python als  str wordt aangemerkt. Een tekenreeks is een willekeurige rij van letters, cijfers, spaties, en leestekens; we zullen er meer over leren in les 7A.
  • 35 is een geheel getal (Eng.: integer). Gehele getallen worden door Python als int aangemerkt.

Een waarde van de verkeerde soort willen gebruiken is een veel voorkomende oorzaak van een fout in een computerprogramma. Het is als het drinken van een boterham: dat kan niet want je kunt alleen maar vloeibare dingen drinken, en een boterham is niet vloeibaar maar vast.

Je kunt het type van een waarde achterhalen door de functie type aan te roepen:

Voorbeeld
Een paar voorbeelden van het gebruik van de functie type.

(Alle Python-types zijn ook klassen (Eng.: classes).)  Bovenstaand voorbeeld laat zien dat er twee verschillende types van getallen zijn in Python: het type int van gehele getallen en het type float van vlottende-kommagetallen (Eng.: floating-point numbers). Het type float laat toe te rekenen met kommagetallen in Python. (Merk op dat kommagetallen in Python genoteerd worden met een punt in plaats van een komma.) Let wel: niet alle kommagetallen kunnen exact voorgesteld worden als een float-waarde. Bij berekeningen met float-waarden zullen er dan ook doorgaans afrondingen optreden; meer hierover in les 7B.

Je kunt float-waarden mixen met int-waarden; het resultaat is een float.

Voorbeeld
Een int en een float mixen.

Wat Python in feite doet wanneer je een float met een int mixt is dat het de int omzet naar een float en dan verder gaat met twee floats.

Meerkeuze-opgave: Float
Wanneer we 1.2 veranderen in 1.5 in bovenstaand programma, wat is dan de eerste regel in de uitvoer?
Correct! We moeten twee dingen nader toelichten, om te laten zien waarom z als 3.0 wordt afgedrukt.
  • Wanneer we x * y berekenen dan mixen we een int en een float, maar Python behandelt die als twee floats, waardoor z een float wordt.
  • Om duidelijk te maken dat het om een float gaat, drukt Python de waarde van z af als 3.0 in plaats van 3.
Merk op dat de waarde en het type van y niet veranderd zijn.

Het is vaak noodzakelijk een waarde van het ene type om te zetten in een ander type. Zoals je aardbeien met een blender kunt omzetten van vast naar vloeibaar, kun je ook een waarde van het ene type soms omzetten naar een ander type daarbij gebruik makend van een typeconversiefunctie (Eng.: typecast function). Je schrijft de naam van het gewenste nieuwe type op dezelfde manier als bij de aanroep van een functie, bijvoorbeeld

x = float("3.4")
print(x-1)
zet de tekenreeks "3.4" om naar het kommagetal 3,4 en drukt dan af 2.4. Zonder de typecast, zou het programma crashen, omdat het niet mogelijk is een getal van een tekenreeks af te trekken.

Soms staat Python toe dat je tekenreeksen en getallen combineert waarbij rekenkundige operatoren worden gebruikt. De opdracht print("hots" * 2) drukt hotshots af. Daarbij is het een Python-regel dat wanneer je een tekenreeks s vermenigvuldigt met een geheel getal n dit betekent dat je n kopieën van s na elkaar plaatst. We zullen later zien dat de "optelling van twee tekenreeksen" ook gedefinieerd is in Python.

Verschillende typeconversies gedragen zich verschillend:

  • wanneer een float in een int wordt omgezet dan gaat het gedeelte na de komma verloren, bijvoorbeeld int(1.234) is 1, en  int(-34.7) is -34.
  • wanneer een str in een int wordt omgezet dan veroorzaakt dat een foutmelding wanneer de tekenreeks niet de precieze vorm heeft van een geheel getal. Bijvoorbeeld: int("1.234") veroorzaakt een foutmelding.
  • wanneer een str in een float wordt omgezet dan veroorzaakt dat een foutmelding wanneer de tekenreeks geen getal voorstelt. Bijvoorbeeld: float("boterham") veroorzaakt een foutmelding.

Een typisch gebruik van type-omzetting dat we weldra zullen zien is het omzetten van invoer door de gebruiker, wat altijd een tekenreeks is, in een numerike vorm. Hier volgt een voorbeeld.

Voorbeeld
Voorbeeld van een type-omzetting.

Hier volgt nog een voorbeeld om deze les af te sluiten.

Omdat er nu veel mogelijke editor-opdrachten zijn, zijn sommige verplaatst naar een knop Meer acties...

Programmeeroefening: Smakelijke type-omzetting
Schrijf een programma dat door wat rekenwerk helpt om je vrienden van voedsel te voorzien bij een feestje met vierkante pizza's. Neem aan dat het nakijkprogramma een tekenreeks inputStr definieert, met een decimale tekenreeks die de lengte van de zijde L van de pizza weergeeft in cm. Bereken de oppervlakte van de pizza met de formule O = L*L. Bereken dan, aangenomen dat elke persoon 100 cm2 pizza eet, het aantal mensen die kunnen mee-eten; rond daarbij af naar beneden naar het dichtstbijzijnde gehele getal. Hint

Voorbeeld: wanneer inputStr is "17.5", zal de oppervlakte 306,25 cm2 zijn, dus is 3 de correcte uitvoer.

Zodra je dit gedaan hebt, kun je doorgaan met de volgende les.