Fouten, validatie en debuggen · oefening
Valideer vóór het omzetten
Voordat int() tekst omzet, kan een programma controleren of die de verwachte vorm heeft. Deze les accepteert gewone toetsenbordcijfers van 0 tot en met 9. De stringmethode .isdigit() is een eenvoudige eerste controle voor die bewust beperkte eis.
Bekijk een vraag om een stoelnummer:
while True:
answer = input("Seat number: ")
if answer.isdigit():
seat = int(answer)
break
print("Please enter digits only.")
print(f"Seat: {seat}")
De volgorde doet ertoe:
input()levert een string op..isdigit()valideert die string.int()wordt pas uitgevoerd nadat de validatie is geslaagd.breakverlaat de lus met een geldig geheel getal.
Als het antwoord ongeldig is, wordt de omzetting overgeslagen. Het bericht wordt afgedrukt en de volgende ronde van de lus vraagt opnieuw om invoer.
Volg twee pogingen
Als de antwoorden eerst front en daarna 12 zijn, verloopt het zo:
| Poging | answer.isdigit() | Actie |
|---|---|---|
"front" | False | druk de uitleg af en herhaal |
"12" | True | zet om naar 12 en verlaat de lus |
Het programma geeft "front" nooit door aan int(), dus die invoer kan geen ValueError veroorzaken.
Valideer de regel die je echt nodig hebt
Voor de gewone invoer van 0 tot en met 9 die we hier gebruiken, accepteert .isdigit() voorbeelden zoals "0" en "27". De methode wijst het volgende af:
negatieve getallen zoals
"-2";kommagetallen zoals
"3.5";tekens zoals in
"+4";woorden zoals
"many".
Een lege string komt ook niet door deze controle. Spaties aan de buitenkant evenmin, omdat dit voorbeeld het antwoord niet opschoont.
Deze oefening gebruikt gewone toetsenbordtekens. Sommige andere cijfertekens, zoals "²", komen door .isdigit(), maar zorgen toch dat int() een ValueError veroorzaakt. Daarom is .isdigit() hier een nuttige eerste controle, geen garantie dat elke mogelijke string kan worden omgezet.
Dat is nuttig wanneer de eis echt alleen cijfers binnen deze beperkte verzameling invoer is. Het is geen volledige test voor elke waarde die int() begrijpt. De volgende lessen introduceren try en except, waarmee je Python zelf kunt laten bepalen of een omzetting naar een geheel getal werkt.
Geef feedback waarmee iemand verder kan
Een foutmelding moet de cursist of gebruiker helpen bij de volgende poging geldige invoer te geven. “Invalid” is vaag. “Please enter digits only.” zegt welk formaat wordt verwacht: alleen cijfers.
Houd de invoervraag binnen de lus. Anders kan het programma de controle eindeloos herhalen zonder een nieuw antwoord op te halen.
De gebruiker voert many in en daarna 3. Hoe vaak roept dit programma int() aan?
while True:
text = input("Count: ")
if text.isdigit():
count = int(text)
break
print("Digits only.")
Opdracht
Bouw een vraag om het aantal kaartjes die bij ongeldige invoer opnieuw wordt gesteld. In deze oefening gebruiken antwoorden gewone toetsenbordtekens en bevatten geldige antwoorden alleen 0 tot en met 9. Gebruik .isdigit() om elk antwoord vóór het omzetten te controleren.
Stel bij elke poging deze vraag:
Number of tickets:
Druk dit af als het antwoord iets anders dan cijfers bevat:
Please enter digits only.
Vraag daarna opnieuw. Zodra het antwoord alleen cijfers bevat, zet je het om in een geheel getal, verlaat je de lus en druk je dit af:
Tickets: 7
De voorbereide testgegevens voeren eerst many in, dan -2 en daarna 7. Je programma moet de eerste twee antwoorden afwijzen zonder te proberen ze om te zetten.