Dictionaries en andere verzamelingen · oefening
Schrijf functies voor dictionaryrecords
Hoofdstuk 8 gaf functies duidelijke invoer en uitvoer. Een dictionary kan meerdere samenhangende invoerwaarden in één record verpakken.
book = {
"title": "Kindred",
"category": "novel",
"year": 1979,
}
Een opmaakfunctie kan dat record ontvangen:
def catalog_line(item):
return f"{item['title']} | {item['category']} | {item['year']}"
De parameter item bevat tijdens de aanroep één dictionary. Zoekopdrachten met haken lezen de verplichte velden.
line = catalog_line(book)
print(line)
Dit drukt het volgende af:
Kindred | novel | 1979
De dictionary bepaalt de vorm van een record
catalog_line verwacht een item met drie sleutels:
"title""category""year"
Die verwachte verzameling velden is de vorm van het record. Python legt die hier niet apart vast. De functie en de gegevens moeten op elkaar aansluiten.
Dit record werkt:
map_item = {
"title": "City map",
"category": "reference",
"year": 2026,
}
In dit record ontbreekt een verplichte sleutel:
incomplete = {
"title": "City map",
"year": 2026,
}
Het aanroepen van catalog_line(incomplete) veroorzaakt een KeyError voor "category".
Dat is geen reden om overal .get() te gebruiken. Als elk catalogusitem een categorie nodig heeft, moet het onvolledige record worden hersteld.
Houd verantwoordelijkheden gescheiden
De dictionary bewaart feiten. De functie bepaalt hoe die worden opgemaakt. De aanroeper bepaalt of de teruggegeven regel wordt afgedrukt, opgeslagen of vergeleken.
line = catalog_line(book)
print(line)
Dit is dezelfde grens waarmee je in hoofdstuk 8 met strings en lijsten oefende, nu toegepast op een gestructureerd record.
Wat bevat summary?
def item_summary(item):
return f"{item['name']}: {item['stock']}"
record = {"name": "Compass", "stock": 8}
summary = item_summary(record)
Opdracht
Maak catalog_line(item) af zodat de functie de verplichte velden van het item in deze vorm teruggeeft:
Kindred | novel | 1979
Lees "title", "category" en "year" uit de dictionaryparameter. Geef de string terug in plaats van binnen de functie af te drukken.
Behoud de bestaande aanroep en de laatste afdrukinstructie.