True en False — leren vragen stellen
Vergelijkingsoperatoren, and / or / not, geketende vergelijkingen, en welke waarden Python als onwaar behandelt — de basis voor het schrijven van voorwaarden.
Hoe wil je leren?
Het probleem dat we oplossen
Een programma moet iets beslissen: komt deze bestelling in aanmerking voor korting? Is het wachtwoord lang genoeg? Staat het artikel op voorraad?
De code die beslist, komt in het volgende hoofdstuk (if). Maar daarvoor heb je eerst het ding nodig waarop een beslissing rust: een vraag waarvan het antwoord ja of nee is. In Python heten die antwoorden True en False, en het type heet bool.
Vandaag leren we alleen vragen stellen, nog niet beslissen. Dat is bewust zo opgedeeld: bijna elke fout die mensen maken bij het schrijven van een if, is eigenlijk een fout in de vraag, niet in de if.
Aan het einde van dit hoofdstuk kun je
- De zes vergelijkingsoperatoren gebruiken
=en==uit elkaar houden- Kleine vragen samenvoegen tot grotere met
and,orennot - Geketende vergelijkingen schrijven zoals
18 <= age <= 60 - Aangeven welke waarden Python als onwaar behandelt, zonder dat ze
Falsezijn
Voorkennis: Invoer van de gebruiker — input() en typen omzetten.
De zes vergelijkingen
age = 22
print(age == 22)
print(age != 22)
print(age > 18)
print(age < 18)
print(age >= 22)
print(age <= 21)True
False
True
False
True
FalseElke vergelijking levert een waarde op — True of False. Dat betekent dat je een vergelijking in een variabele kunt opslaan:
age = 22
is_adult = age >= 18
print(is_adult)
print(type(is_adult))True
<class 'bool'>Zo'n naam maakt de code veel leesbaarder: is_adult zegt wat er wordt gecontroleerd, terwijl age >= 18 de lezer dwingt het zelf uit te zoeken.
= en == — één teken, een andere betekenis
total = 100 # an instruction: put 100 into total
print(total == 100) # a question: is total 100?True=slaat op (toekenning)==vraagt (vergelijking)
Schrijf = waar een voorwaarde hoort, dan geeft Python 3 een duidelijke foutmelding met een nuttige tip:
SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?Goed nieuws — deze fout blijft niet stil, hij wordt opgemerkt.
Tekst vergelijken
print("rafi" == "rafi")
print("Rafi" == "rafi")
print("apple" < "banana")
print(len("password123") >= 8)True
False
True
TrueTwee dingen om op te letten:
Hoofdletters tellen mee. "Rafi" is niet gelijk aan "rafi". Wanneer je tekst vergelijkt die iemand heeft getypt, voer dan eerst .strip().lower() uit — anders worden mensen afgewezen die hun naam met een hoofdletter schreven of per ongeluk een spatie typten:
typed = " RAFI "
print(typed == "rafi")
print(typed.strip().lower() == "rafi")False
True< werkt ook op tekst, volgens de alfabetische volgorde, zoals in een woordenboek — vandaar "apple" < "banana". Daar berust het sorteren van een lijst met namen op.
and, or, not
Drie woorden voegen kleine vragen samen tot grotere:
age = 22
has_id = True
print(age >= 18 and has_id)
print(age >= 60 or has_id)
print(not has_id)True
True
Falseand— waar wanneer beide waar zijnor— waar wanneer minstens één waar isnot— draait het om
Het hele plaatje in één keer:
print(True and True)
print(True and False)
print(False and False)
print(True or False)
print(False or False)True
False
False
True
Falseorbetekent "een of meer", niet "precies één". In het dagelijks taalgebruik impliceert "thee of koffie?" dat je één van de twee kiest. Deorvan Python isTrue, ook wanneer beide kanten waar zijn. Als je dat vergeet, verrassen voorwaarden je.
not geldt altijd voor wat er direct achter staat, en wordt als eerste uitgevoerd. De volgorde is: eerst not, dan and, en or als laatste.
print(True or False and False)
print((True or False) and False)True
FalseOp de eerste regel werd and eerst uitgevoerd, dus las Python True or (False and False) — dat is True or False, wat True is. Op de tweede regel veranderden de haakjes de volgorde. Twijfel je, gebruik dan haakjes — hier net zo goed als bij rekenkunde.
Geketende vergelijkingen
Om te controleren of iets tussen twee grenzen ligt, staat Python toe dat je het schrijft zoals in de wiskunde:
marks = 72
print(0 <= marks <= 100)
print(marks > 60 and marks < 80)
print(60 < marks < 80)True
True
TrueDe tweede en derde regel zeggen hetzelfde, en de derde is beter leesbaar. Veel programmeertalen staan dit niet toe; Python staat het wel toe, en je kunt het gerust gebruiken.
Welke waarden Python als onwaar behandelt
Het is niet alleen False — een handvol gewone waarden telt ook als onwaar:
print(bool(0))
print(bool(1))
print(bool(-5))
print(bool(""))
print(bool("hello"))
print(bool("0"))
print(bool("False"))False
True
True
False
True
True
TrueDe regel in één zin: nul en lege dingen zijn onwaar, al het andere is waar. Dus 0 is onwaar en lege tekst "" is onwaar; maar -5 is waar (het is niet nul), en "0" en "False" zijn waar — want ze zijn niet leeg, ze bevatten tekens.
Die laatste twee regels zijn de echte valkuil. Alles wat uit input() komt, is tekst, dus ook als iemand 0 typt, heb je "0" — en dat vindt Python waar. Wil je getallen vergelijken, zet ze dan eerst om met int().
De regel "leeg is onwaar" is ook praktisch bruikbaar — om iemand te vangen die op Enter drukte zonder iets te typen:
name = input("Name: ").strip()
print("Name was given:", bool(name))Name:
Name was given: FalseEen compleet voorbeeld
eligibility.py:
# Check a discount rule without deciding anything yet
age = int(input("Age : "))
years_member = int(input("Years a member : "))
order_total = float(input("Order total : "))
is_adult = age >= 18
is_senior = age >= 60
is_loyal = years_member >= 2
is_large_order = order_total >= 1000
# The rule: adults who are either long-standing members or spending a lot
gets_discount = is_adult and (is_loyal or is_large_order)
print()
print(f"Adult : {is_adult}")
print(f"Senior : {is_senior}")
print(f"Loyal member : {is_loyal}")
print(f"Large order : {is_large_order}")
print(f"Gets discount : {gets_discount}")Age : 34
Years a member : 1
Order total : 1500
Adult : True
Senior : False
Loyal member : False
Large order : True
Gets discount : TrueMerk op dat elke voorwaarde eerst een eigen naam kreeg, en dat de regel daarna uit die namen is opgebouwd. Geschreven als één regel — age >= 18 and (years_member >= 2 or order_total >= 1000) — zou de code exact hetzelfde doen, maar het is veel werk om de regel zes maanden later weer te reconstrueren. De haakjes doen er ook toe: zonder haakjes zou and eerst worden uitgevoerd, en dan zou de regel zelf veranderen.
Wanneer het misgaat
SyntaxError: invalid syntax. Maybe you meant '==' ... Er staat een = waar een vergelijking hoort. Gebruik ==.
Deze zouden gelijk moeten zijn, maar ik krijg False Controleer drie dingen: losse spaties (.strip()), hoofdletters (.lower()), en het type — "22" == 22 is altijd False, want tekst en een getal zijn nooit gelijk.
TypeError: '<' not supported between instances of 'str' and 'int' Je hebt tekst met een getal vergeleken, waarschijnlijk omdat je vergeten bent de invoer uit input() om te zetten. Wikkel het in int().
Twee decimale getallen zijn met == niet gelijk Dat is te verwachten — denk terug aan de decimale valkuil uit hoofdstuk 5. Vergelijk na het afronden met round().
De voorwaarde doet niet wat er staat Controleer de volgorde van and/or: eerst not, dan and, dan or. Gebruik haakjes om je bedoeling expliciet te maken.
Stap 4 van 6 — Voorspellen
Test je begrip
Wat is de uitvoer van deze drie regels?
print(5 > 3 and 2 > 4)
print(5 > 3 or 2 > 4)
print(not 5 > 3)- AFalse True True
- BFalse False True
- CTrue True False
- DFalse True False
Hoe telt elk van deze drie waarden als waar of onwaar?
print(bool("False"))
print(bool(""))
print(bool(0))- ATrue False False
- BTrue True False
- CFalse True False
- DFalse False False
De persoon typte Yes (hoofdletter Y, één spatie aan het eind) en het programma zegt Continuing: False. Waarom, en wat is de beste oplossing?
answer = input("Type yes to continue: ")
print("Continuing:", answer == "yes")- A`answer` moet eerst met `bool()` worden omgezet
- BDe `==` moet een `=` zijn
- CZowel de spatie aan het eind als de hoofdletter tellen mee in een vergelijking — er is `answer.strip().lower() == "yes"` nodig
- DEen `input()` kan nooit gelijk zijn aan `"yes"`, dus moet `in` worden gebruikt
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 password_check.py dat een wachtwoord inleest en True/False print voor vier vragen:
- De lengte is minstens 8
- De lengte ligt tussen 8 en 20 (schrijf dit als geketende vergelijking)
- Het woord
"password"komt er niet in voor (je hebtnoteninnodig, en je moet naar kleine letters omzetten voordat je vergelijkt) - Of alle drie hierboven tegelijk waar zijn
Draai het daarna met minstens vier verschillende wachtwoorden: één heel kort, één heel lang, één met een hoofdletter, zoals Password, en één die aan alles voldoet. Controleer of alle vier het juiste antwoord geven — vooral het derde, want daar schuilt de valkuil van hoofdletters.
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