Invoer van de gebruiker — input() en typen omzetten
Lezen wat iemand typt met input(), waarom het altijd een str is, en welke fouten er verschijnen wanneer je het omzet met int() en float().
Hoe wil je leren?
Het probleem dat we oplossen
Tot nu toe stond elk programma met zijn getallen in het bestand geschreven. Om het met andere getallen te laten draaien, moest je het bestand openen en aanpassen.
Echte programma's werken zo niet. Een programma vraagt, en de persoon die het gebruikt, antwoordt.
In Python is vragen de taak van input(). Het duurt even om het te leren. Maar er hoort één regel bij die elke nieuwe programmeur minstens één keer in de val laat lopen: wat input() teruggeeft, is altijd tekst — ook als de persoon een prima getal heeft getypt. Zonder die ene regel te kennen, is je eerste rekenprogramma zo kapot.
Aan het einde van dit hoofdstuk kun je
- Lezen wat iemand typt met
input(), met een duidelijke vraag erbij - Uitleggen waarom invoer altijd een
stris - Het omzetten naar een getal doen met
int()enfloat() - Een
TypeError, eenValueErroren een fout antwoord zonder foutmelding uit elkaar houden - Invoer opschonen, zodat een losse spatie je programma niet breekt
Voorkennis: Werken met tekst — indexering, slicing en f-strings.
Hoe input() werkt
name = input("What is your name? ")
print(f"Hello, {name}!")Voer het uit:
What is your name? Rafi
Hello, Rafi!Er gebeuren drie dingen. input() toonde de vraag tussen de haakjes; daarna stopte het en wachtte tot de persoon iets typte en op Enter drukte; en daarna gaf het terug wat er getypt was, en dat hebben we opgeslagen in name.
Let op de spatie aan het eind van de vraag — "What is your name? ". Zonder die spatie staat wat de persoon typt vastgeplakt aan het vraagteken, en dat ziet er verkeerd uit.
Deze programma's moeten in de terminal worden uitgevoerd.input()wacht tot iemand typt, dus het werkt niet op een website of in het voorbeeldvenster van een editor. Voerpython ask.pyuit in je eigen terminal — zo werkt deze hele cursus trouwens al.
De regel waar iedereen één keer in trapt
age = input("Your age: ")
print(type(age))
print("Next year:", age + 1)Your age: 22
<class 'str'>
Traceback (most recent call last):
File "D:\python-lab\lesson-07\ask.py", line 3, in <module>
print("Next year:", age + 1)
~~~~^~~
TypeError: can only concatenate str (not "int") to strDe persoon typte 22. Op het scherm staat een getal. En type(age) zegt str. (De regel File toont het volledige pad van je bestand, dus op jouw computer ziet die er anders uit.)
De reden is logisch als je erover nadenkt: een toetsenbord maakt tekens, geen getallen. Iemand kan 22 typen, of abc, of 12.5. input() had kunnen gokken — "dat ziet eruit als een getal, dus ik zet het om" — maar dan zou dezelfde regel soms een str teruggeven en soms een int, en je zou van tevoren nooit weten welke. Daarom houdt Python één regel aan: altijd tekst. Omzetten is jouw taak.
int() en float()
age = input("Your age: ")
age = int(age)
print(type(age))
print("Next year:", age + 1)Your age: 22
<class 'int'>
Next year: 23De twee stappen passen op één regel, en zo wordt het meestal geschreven:
age = int(input("Your age: "))
print("Next year:", age + 1)Lees het van binnen naar buiten: input() maakte tekst, int() zette die om in een geheel getal, en het resultaat ging naar age.
Voor decimale getallen gebruik je float():
price = float(input("Price: "))
print("With tax:", round(price * 1.15, 2))Price: 249.50
With tax: 286.92Welke je kiest: int voor dingen die je telt (leeftijden, aantallen, hoeveelheden), float voor dingen die je meet (prijzen, gewichten, gemiddelden).
Twee fouten, en één vergissing die geen foutmelding geeft
Als de omzetting is vergeten of de invoer niet deugt, kunnen er drie verschillende dingen gebeuren. De namen zijn makkelijk met elkaar te verwarren, dus bekijk ze naast elkaar.
TypeError — het type klopt niet. Je bent de omzetting vergeten en probeerde een getal bij tekst op te tellen:
qty = input("Quantity: ")
print(qty + 2)Quantity: 3
Traceback (most recent call last):
File "D:\python-lab\lesson-07\ask.py", line 2, in <module>
print(qty + 2)
~~~~^~~
TypeError: can only concatenate str (not "int") to strqty bevat de tekst "3", en + op tekst plakt alleen een ander stuk tekst eraan vast, geen getal. Python raadt niet of je wilde optellen of aaneenplakken — dus stopt het.
Helemaal geen foutmelding — alleen een fout antwoord. Schrijf nu * in plaats van +, nog steeds zonder omzetting:
qty = input("Quantity: ")
print(qty * 2)Quantity: 3
33Dit keer is er helemaal geen foutmelding. "3" * 2 betekent de tekst twee keer — "33". Het programma draait gewoon door en het antwoord is fout. Een stil fout antwoord is erger dan een foutmelding, want er is niets dat je waarschuwt.
ValueError — het type klopt, maar de tekst is geen getal:
age = int(input("Your age: "))Your age: twenty
Traceback (most recent call last):
File "D:\python-lab\lesson-07\ask.py", line 1, in <module>
age = int(input("Your age: "))
^^^^^^^^^^^^^^^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'twenty'int() wil het werk wel doen, alleen niet met 'twenty'. De melding noemt zelfs de foute waarde, tussen aanhalingstekens aan het eind.
Een subtiele, maar heel echte valkuil:
count = int(input("Count: "))Typ je 12.5, dan geeft dit ook een ValueError — omdat int() tekst met een decimaalpunt erin niet accepteert. Als decimale getallen mogelijk zijn, lees je het in met float() en zet je het daarna met int() om naar een geheel getal als je dat nodig hebt.
We hebben nog niet alles om deze fouten te voorkomen — daarvoor heb je voorwaarden én lussen nodig, en die komen in de volgende hoofdstukken. Herken de fout voorlopig, en leer de melding lezen.
De invoer opschonen
Mensen typen extra spaties en mengen hoofdletters met kleine letters. De methoden uit het vorige hoofdstuk zijn precies wat je nodig hebt:
full_name = input("Name: ").strip().title()
answer = input("Continue? (yes/no) ").strip().lower()
print(f"Name is {full_name}")
print(f"Answer is {answer}")Name: rafi ahmed
Continue? (yes/no) YES
Name is Rafi Ahmed
Answer is yesMaak er een gewoonte van om altijd .strip() te gebruiken op alles wat uit input() komt. Een programma hoeft niet te breken door één extra spatie.
Een compleet voorbeeld
bill.py:
# Ask for one order and print a small bill
print("--- Order entry ---")
customer = input("Customer name : ").strip().title()
item = input("Item : ").strip()
quantity = int(input("Quantity : "))
unit_price = float(input("Unit price : "))
subtotal = quantity * unit_price
tax = subtotal * 0.05
total = subtotal + tax
print()
print("--- Bill ---")
print(f"Customer : {customer}")
print(f"Item : {item} x {quantity}")
print(f"Subtotal : {subtotal:.2f}")
print(f"Tax (5%) : {tax:.2f}")
print(f"Total : {total:.2f}")--- Order entry ---
Customer name : rafi ahmed
Item : notebook
Quantity : 4
Unit price : 85.50
--- Bill ---
Customer : Rafi Ahmed
Item : notebook x 4
Subtotal : 342.00
Tax (5%) : 17.10
Total : 359.10Vier invoeren, vier verschillende behandelingen: de naam wordt opgeschoond en met hoofdletters geschreven, het artikel alleen opgeschoond, de hoeveelheid omgezet naar een geheel getal en de prijs naar een decimaal getal. Bij elke invoer moet je twee dingen beslissen — welk type je nodig hebt, en hoe je hem opschoont.
Wanneer het misgaat
TypeError: can only concatenate str (not "int") to str De omzetting ontbreekt. Schrijf int(input(...)) of float(input(...)).
Ik wilde vermenigvuldigen, maar de tekst herhaalt zich "3" * 2 geeft "33". De waarde is nooit omgezet naar int. Deze fout is juist gevaarlijk omdat er geen foutmelding verschijnt — twijfel je, print dan type().
ValueError: invalid literal for int() with base 10 Wat de persoon typte is geen geheel getal — een woord, een decimaal getal, of helemaal niets (alleen Enter). Als decimale getallen mogelijk zijn, gebruik dan float().
Het programma staat daar gewoon en toont niets Het wacht op jouw invoer. Zonder vraag in input() verschijnt er niets op het scherm en lijkt het vastgelopen. Geef er altijd een vraag aan mee.
input() werkt niet in mijn editor Sommige editors en online blokken kunnen geen invoer aannemen. Open een terminal en voer python bill.py uit.
Er komt een extra lege regel als ik op Enter druk input() geeft alleen je tekst terug en bewaart de afsluitende nieuwe regel niet. Een extra lege regel komt bijna zeker van een print() die je zelf hebt geschreven.
Stap 4 van 6 — Voorspellen
Test je begrip
De persoon typt 42 en drukt op Enter. Wat print de tweede regel?
value = input("Number: ")
print(type(value))- A<class 'input'>
- B<class 'int'>
- C<class 'float'>
- D<class 'str'>
De persoon typte 3 en het programma printte Doubled: 33, zonder enige foutmelding. Waarom, en wat repareert het?
qty = input("Quantity: ")
print("Doubled:", qty * 2)- A`qty + qty` schrijven in plaats van `qty * 2` zou het repareren
- BDe `print` heeft een `+` nodig in plaats van een komma
- C`input()` kan geen getallen lezen, dus is een andere functie nodig
- D`qty` is een `str`, en tekst met een getal vermenigvuldigen herhaalt de tekst — er is `int(qty) * 2` nodig
Wat gebeurt er als de persoon 12.5 typt?
count = int(input("Count: "))
print(count + 1)- AEen `ValueError` — `int()` accepteert geen tekst met een decimaalpunt; lees het in met `float()` als decimalen mogelijk zijn
- B`count` wordt `12`, omdat `int()` alles na het decimaalpunt afknipt
- CEen `TypeError`, omdat het type van de invoer en dat van de variabele niet overeenkomen
- D`count` wordt `13`, omdat `int()` afrondt op het dichtstbijzijnde gehele getal
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 travel.py dat vier vragen stelt en een kleine berekening toont:
- De naam van de passagier (opgeschoond, met hoofdletters)
- Hoeveel passagiers (een geheel getal)
- De prijs per passagier (een decimaal getal)
- Het kortingspercentage (een decimaal getal)
Print daarna het totale tarief, het kortingsbedrag en het uiteindelijke bedrag — alle drie op twee decimalen.
Als het werkt, probeer het dan drie keer opzettelijk te breken:
- Typ
twoals aantal passagiers — welke fout verschijnt er, en wat zegt de melding? - Typ
2.5als aantal passagiers — wat gebeurt er, en waarom? - Zet een paar spaties voor en na de naam — blijft de uitvoer goed?
Als het antwoord op de laatste ja is, schrijf je al betere code dan de gemiddelde beginner. De oplossingen voor de andere twee komen zodra je voorwaarden en lussen hebt.
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