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 zin voor ons te herhalen. We hebben ook meerdere rekenvoorbeelden met getallen gezien. Getallen en zinnen zijn fundamenteel verschillende objecten, en wanneer je ze op de verkeerde manier in Python door elkaar gebruikt  kan dat een foutmelding tot gevolg hebben:

Voorbeeld
Hier wordt een string met een getal te vergeleken.

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

  • "Hello, World!" is een string, die door Python als  str wordt aangemerkt. Een string is een willekeurige rij van getallen, letters en leestekens; we zullen er meer over leren in les 7A.
  • 35 is een integer, die door Python als int wordt aangemerkt. Integer betekent geheel getal; zo zijn bijvoorbeeld 42, -12, en 0 integers (gehele getallen).

Een object van het 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 object bepalen, door de functie type aan te roepen.

Voorbeeld
Een paar voorbeelden van het gebruik van type.

(De betekenis van class lijkt op die van type.)  Bovenstaand voorbeeld laat zien dat getallen twee verschillende typen kennen: int, die we hierboven hebben genoemd en float, die we gebruiken om decimale getallen op te slaan. Je moet floats zien als niet precieze of benaderde waarden (meer hierover in les 7B). Je kunt float waarden mixen met int waarden, en 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 in een float vertaalt 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.
  • De wiskundig exacte waarde van z is 1.5 maal 2, dus 3, maar opgeslagen in een inexacte decimale vorm, van het type float. Wanneer Python een float afdrukt, ook al is de waarde exact 3, dan wordt het toch afgedrukt eindigend met .0 om aan te duiden dat het een niet exacte waarde betreft.
Merk op dat de waarde en het type van y niet veranderd zijn.

Het is vaak noodzakelijk het ene type dat om te zetten in een ander type. Zoals je aardbeien met een blender kunt omzetten  van vast naar vloeibaar, kun je ook dat van het ene type soms omzetten in een ander type daarbij gebruik makend van een  typecast functie. 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)
verandert de string "3.4" in de float 3.4, en drukt dan af 2.4. Zonder de typecast, zou het programma crashen, omdat het niet mogelijk is een getal van een string af te trekken. .

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

Verschillende typecasts gedragen zich verschillend

  • wanneer een float in een int wordt omgezet dan gaat het gedeelte achter 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 string niet de precieze vorm heeft van een integer, bijvoorbeeld. int("1.234") veroorzaakt een foutmelding.
  • wanneer een str in een float wordt omgezet dan veroorzaakt dat een foutmelding wanneer de string niet een getal bevat, bijvoorbeeld float("boterham") veroorzaakt een foutmelding.

Een normaal gebruik van type omzetting dat we weldra zullen zien is het omzetten van invoer door de gebruiker, dat altijd een string 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 helpt om je vrienden van voedsel te voorzien bij een feestje door wat rekenwerk bij  vierkante pizza's. Neem aan dat het nakijkprogramma een string inputStr definieert, met een decimale string die de lengte van de zijde  L van de pizza weergeeft in cm. De oppervlakte van de pizza zal worden berekend 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