0%

Dictionaries en andere verzamelingen · oefening

Wanneer waarden als waar of onwaar gelden

Voorwaarden hebben niet altijd een expressie nodig die de letterlijke waarde True of False oplevert.

Je kunt een andere waarde rechtstreeks in een voorwaarde plaatsen:

catalog = []

if catalog:
    print("The catalog has items.")
else:
    print("The catalog is empty.")

De lege lijst volgt het pad van else. Python behandelt sommige waarden als onwaar wanneer het een beslissing moet nemen.

Vraag hoe Python een waarde ziet

De functie bool() toont het booleaanse resultaat dat Python gebruikt. Voer dit voorbeeld uit, vervang vervolgens een van de waarden en voer het opnieuw uit:

Try it

De uitvoer is:

False
True
False
True

Een lege string en een lege lijst gelden als onwaar. Een niet-lege string en een niet-lege lijst gelden als waar.

De termen zijn:

  • een falsy waarde geldt als False in een voorwaarde;

  • een truthy waarde geldt als True in een voorwaarde.

Deze woorden beschrijven hoe een waarde zich in een voorwaarde gedraagt. Ze veranderen het type van de waarde niet. Een lege lijst blijft een lijst.

Veelvoorkomende falsy waarden

Deze bekende waarden zijn falsy:

SoortFalsy voorbeeld
booleaanse waardeFalse
geen waardeNone
getal0 of 0.0
string""
lijst[]
dictionary{}
setset()

De meeste andere waarden van deze typen zijn truthy. Zo zijn 5, "Python", [0] en {"ready": False} allemaal truthy.

Kijk goed naar [0]. Het getal in de lijst is falsy, maar de lijst zelf is niet leeg, dus de lijst is truthy.

Wat drukt dit af?

values = [0]

if values:
    print("Has an item")
else:
    print("Empty")

Gebruik not voor het lege geval

Je leerde dat not een booleaans resultaat omkeert. Het keert ook het booleaanse resultaat van een truthy of falsy waarde om:

query = "   "
clean_query = query.strip()

if not clean_query:
    print("Enter a title to search.")

Na .strip() is clean_query gelijk aan "". Die lege string is falsy, dus not clean_query is True.

Dit is een veelgebruikte en leesbare manier om te controleren of een string of verzameling leeg is:

if not catalog:
    print("The catalog is empty.")

Behoud expliciete controles wanneer het onderscheid ertoe doet

Truthiness groepeert meerdere waarden. Dat is handig wanneer de regel echt “leeg of niet leeg” betekent. Het kan te ruim zijn wanneer verschillende falsy waarden verschillende betekenissen hebben.

De zoekles gebruikte:

if match is None:
    print("No matching title.")

Behoud die expliciete controle. Een zoekresultaat van None betekent dat er geen record is gevonden. Een lege dictionary zou een andere waarde zijn, ook al zijn beide falsy.

Kies de voorwaarde die de werkelijke regel van het programma uitdrukt:

  • gebruik if not items wanneer de regel betekent dat de verzameling leeg is;

  • gebruik if value is None wanneer de regel betekent dat er geen waarde is teruggegeven;

  • gebruik if score == 0 wanneer nul een specifieke betekenis heeft die je expliciet wilt benoemen.

Waarom is if match is None na een zoekopdracht duidelijker dan if not match?

Beschrijf of een zoekopdracht kan beginnen

De oefening combineert de twee nuttige controles op leegte uit deze les. Controleer eerst of de catalogus leeg is. Schoon daarna de zoekterm op en controleer of er tekst overblijft. Geef een bericht terug in plaats van binnen de functie af te drukken.

Opdracht

Maak search_status(catalog, query) af.

  1. Maak clean_query met query.strip().

  2. Geef "The catalog is empty." terug als catalog leeg is.

  3. Geef anders "Enter a title to search." terug als clean_query leeg is.

  4. Geef anders "Ready to search N items for QUERY." terug met de lengte van de catalogus en de opgeschoonde zoekterm.

Gebruik truthiness met if not catalog en if not clean_query. Verander de catalogus of de zoekterm niet.