Variabelen en types — hoe een programma onthoudt
Waarden opslaan in variabelen, de regels voor het benoemen ervan, en de vier basistypen — int, float, str, bool — plus de fout die beginners het meest maken.
Hoe wil je leren?
Het probleem dat we oplossen
Tot nu toe konden onze programma's niets onthouden. Alles wat werd afgedrukt, was weg.
In het echte werk gaat het niet zo. In een factuurprogramma wordt een prijs één keer berekend en op drie plekken gebruikt. In een rapport moet eerst een totaal worden uitgerekend en later worden gebruikt. Het programma moet onthouden.
Daarnaast is er nog een tweede probleem. In het vorige hoofdstuk gaf "2" + "3" 23, terwijl 2 + 3 5 gaf — hetzelfde symbool, twee verschillende gedragingen. Dat komt omdat Python die twee dingen als verschillend van soort beschouwt. Die soort heet een type, en het grootste deel van de fouten die beginners maken, komt juist hier vandaan.
Aan het einde van dit hoofdstuk kun je
- Een waarde opslaan in een variabele en deze later veranderen
- Namen kiezen die Python accepteert en die voor mensen leesbaar zijn
- De vier basistypen herkennen:
int,float,str,bool - Het type van elke waarde opvragen met
type() - Een
TypeErrorlezen en precies zeggen waarover deze klaagt
Voorkennis: Zien met print, uitleggen met opmerkingen.
Een variabele is een naam
city_count = 4Lees die regel van rechts naar links: de waarde 4 is ontstaan, en het label city_count is eraan vastgemaakt. Vanaf nu geeft het schrijven van city_count je die waarde terug.
city_count = 4
print("Cities:", city_count)
print("Double:", city_count * 2)Cities: 4
Double: 8=betekent niet gelijk. In de wiskunde isx = 4een bewering: x en 4 zijn hetzelfde. In Python is=een instructie: "sla deze waarde op onder die naam." Daarom istotal = total + 5— onmogelijk in de wiskunde — volkomen normaal in Python. Het betekent: "neem wattotalnu bevat, tel er 5 bij op, en stop het resultaat terug intotal." Om te controleren of twee dingen gelijk zijn, gebruik je een ander symbool,==, dat we later zullen tegenkomen.
Een waarde veranderen
Door een nieuwe waarde aan een variabele toe te wijzen, blijft er niets van de oude waarde over:
stock = 20
print("Before:", stock)
stock = stock - 3
print("After:", stock)Before: 20
After: 17Kijk eens wat er gebeurt als twee namen naar dezelfde waarde wijzen:
a = 10
b = a
a = 99
print(a, b)99 10De regel b = a betekent: plaats het label b op dezelfde waarde waar a aan vastzit. Nu verwijzen beide namen naar dezelfde 10. Vervolgens haalt a = 99 het label a eraf en plaatst het op de nieuwe waarde 99 — b blijft waar hij was, bij 10. Door een nieuwe waarde aan één naam toe te wijzen, wordt alleen die naam verplaatst, niet de andere.
Houd dit beeld in gedachten: twee namen kunnen naar dezelfde waarde verwijzen. Bij getallen en strings levert dat geen problemen op, maar later, als je lijsten leert kennen — waarvan de inhoud ter plekke kan worden veranderd — wordt dit punt erg belangrijk.
Regels voor namen
Wat Python niet accepteert:
- Beginnen met een cijfer:
2nd_pricegaat niet,price_2wel - Een streepje in het midden:
total-pricegaat niet, Python leest het als aftrekken - Een spatie in het midden:
total pricegaat niet - Python-sleutelwoorden:
class,for,if,import,return,Nonekunnen niet als namen worden gebruikt
Wat Python accepteert, maar wat je beter niet kunt schrijven:
x1 = 4500 # clear today, meaningless in three weeks
Total_Price = 4500 # legal Python, but not the Python convention
l = 4500 # lowercase L and the digit one look almost identicalDe professionele Python-conventie is snake_case — kleine letters, met underscores tussen woorden:
total_price = 4500
customer_name = "Rafi"
items_in_cart = 3Zich druk maken over namen lijkt misschien tijdverspilling, maar code wordt één of twee keer geschreven en twintig keer gelezen. Een naam die zichzelf uitlegt, doet het werk van een opmerking.
De vier basistypen
items = 7 # int — a whole number
price = 249.50 # float — a number with a decimal point
name = "Rafi" # str — text, inside quotes
is_paid = True # bool — only True or False
print(type(items))
print(type(price))
print(type(name))
print(type(is_paid))<class 'int'>
<class 'float'>
<class 'str'>
<class 'bool'>type() is je instrument om twijfel weg te nemen. Wanneer een variabele zich vreemd gedraagt, is de eerste stap om het type af te drukken. Meestal staat het antwoord daar meteen.
Twee kleine, maar belangrijke opmerkingen:
True en False beginnen met een hoofdletter. Schrijf je true, dan behandelt Python het als een variabelenaam en meldt dat hij die naam niet kent.
"7" en 7 zijn niet hetzelfde. Het eerste is een string, het tweede is een getal. Ze lijken op elkaar, maar zijn voor Python compleet verschillend:
a = 7
b = "7"
print(type(a), type(b))
print(a * 3)
print(b * 3)<class 'int'> <class 'str'>
21
777De fout die iedereen tegenkomt
age = "22"
print(age + 1)Traceback (most recent call last):
File "C:\Users\Rafi\python-lab\lesson-04\demo.py", line 2, in <module>
print(age + 1)
~~~~^~~
TypeError: can only concatenate str (not "int") to strHet bericht ziet er intimiderend uit, maar is in feite precies: alleen een str kan aan een str worden geplakt, niet aan een int. Python kan niet raden of je wilde optellen of aaneenplakken — dus in plaats van te gokken, houdt hij op.
De regel File toont het volledige pad van je eigen bestand, dus die zal op jouw computer anders zijn. De andere regels blijven hetzelfde.
Lees foutmeldingen van onder naar boven. De laatste regel zegt wat er mis is; de regel erboven zegt waar. Beginners raken vaak in paniek bij een traceback en slaan hem helemaal over, maar de foutmeldingen van Python zijn de meest nuttige tekst op je scherm.
De oplossing is om van het getal een getal te maken:
age = "22"
print(int(age) + 1)23int() converteert een string naar een geheel getal. Wanneer dat werkt en wanneer het faalt, behandelen we uitgebreid in een later hoofdstuk over input(), want daar komt dit probleem elke keer voor.
Een compleet voorbeeld
invoice.py:
# Invoice for a single order, all figures in one place
customer_name = "Rafi"
unit_price = 249.50
quantity = 3
is_member = True
subtotal = unit_price * quantity
discount = 50.0
total = subtotal - discount
print("Customer :", customer_name)
print("Quantity :", quantity)
print("Subtotal :", subtotal)
print("Discount :", discount)
print("Total :", total)
print("Member :", is_member)Customer : Rafi
Quantity : 3
Subtotal : 748.5
Discount : 50.0
Total : 698.5
Member : TrueLet op waar het echte voordeel zit: om de prijs te veranderen, hoef je alleen de regel unit_price aan te passen, en alle berekeningen eronder worden automatisch correct. Hadden de getallen rechtstreeks in de print-aanroepen gestaan, dan zou je ze allemaal moeten opzoeken en aanpassen — en één vergeten betekent een verkeerd rapport.
Wanneer het misgaat
NameError: name 'total' is not defined De naam die je hebt gebruikt, is nog niet voorzien van een waarde, of hij is verkeerd gespeld. Python behandelt total en totl als twee verschillende namen. Let ook op hoofdletters: Total is niet hetzelfde als total.
TypeError: can only concatenate str (not "int") to str Je hebt geprobeerd om een getal aan een string te plakken. Converteer het met int(), of gebruik een komma — print("Age:", age) — want print kan zelf goed omgaan met gemengde typen.
SyntaxError: cannot assign to expression here. Maybe you meant '==' instead of '='? Een streepje in een naam veroorzaakt dit. Op de regel total-price = 5 ziet Python een berekening die price van total aftrekt, en je kunt geen waarde opslaan in een berekening. Gebruik een underscore: total_price.
SyntaxError: invalid syntax Je hebt geprobeerd om een Python-sleutelwoord als naam te gebruiken, bijvoorbeeld class = 10. Het bericht noemt geen sleutelwoorden; het plaatst alleen een ^ onder de =, dus je moet zelf controleren of de naam een sleutelwoord is. Kies iets anders: class_name, grade.
NameError: name 'true' is not defined. Did you mean: 'True'? True en False beginnen met een hoofdletter.
Stap 4 van 6 — Voorspellen
Test je begrip
Wat wordt er afgedrukt?
a = 10
b = a
a = 99
print(a, b)- A10 99
- B10 10
- C99 99
- D99 10
Welke van deze is een geldige naam voor een variabele in Python?
- Aclass
- Bitem-2
- C2nd_item
- Ditem_2
Dit programma geeft een TypeError. Wat is er precies mis, en hoe los je het op?
age = "22"
next_year = age + 1
print("Next year:", next_year)- A`next_year` is gebruikt zonder eerst te zijn gedeclareerd
- B`age` bevat een string, geen getal — schrijf `age = 22`, of gebruik `int(age) + 1`
- CAls je `age + "1"` schrijft in plaats van `age + 1`, krijg je 23
- DIn `print` moet je een `+` gebruiken in plaats van een komma
Voor antwoorden heb je een account nodig
Log in om je antwoorden te controleren
De vragen staan hierboven, en ze in je hoofd uitwerken is waar het om draait. Log in om de antwoorden, de uitleg en de hints in drie niveaus te zien.
Jouw beurt
Schrijf een bestand genaamd shipping.py met:
- Vier variabelen — één
int, éénfloat, éénstr, éénbool— allemaal zinvol benoemd in snake_case - Ten minste één berekening die gebruikmaakt van twee ervan om een derde variabele te produceren
- Het type van alle vier variabelen, afgedrukt met
type() - Eén variabele die eerst een waarde krijgt, dan opnieuw wordt toegewezen — druk de waarde in beide stappen af
Breek het daarna expres: neem een str-variabele, schrijf + 1 erachter, en voer het bestand uit. Lees de hele foutmelding, vooral de laatste regel. Je zult dit bericht nog vele malen tegenkomen; het nu bewust oproepen maakt het later vertrouwd.
Deze missie heeft nog meer
Wat je hierboven las is de volledige missie — er is niets uit weggelaten. Pro voegt toe:
- Wat er echt onder de motorkap gebeurt: hoe Python dit uitvoert
- De volledige oplossing van de oefening, stap voor stap uitgewerkt
- Moeilijkere extra oefeningen
- De sollicitatievraag over dit onderwerp, met een modelantwoord
Stap 6 van 6
Uitdaging — de hoofdstukquiz
Tien vragen van makkelijk naar moeilijk. De laatste zijn met opzet lastig.
Log in om de quiz te maken