12 Tuples
Bij het loopen door een dictionary zag je al for sleutel, waarde in ... —
twee namen die samen één paar opvangen. Dat paar heeft een naam: kijk wat
hier gebeurt.
punt = (3, 5)
print(punt[0]) # 3
print(punt[1]) # 5
punt is een tuple: een vast rijtje waardes dat bij elkaar hoort,
tussen ronde haakjes. Opvragen werkt met een index, net als bij een
lijst. Het verschil: een tuple kun je na het maken niet meer
veranderen — geen append, geen toewijzen aan punt[0].
Uitpakken
De waardes van een tuple kun je in één regel in losse variabelen zetten. Dat heet unpacking:
punt = (3, 5)
x, y = punt
print(f"x is {x}, y is {y}") # x is 3, y is 5
Het aantal namen links moet gelijk zijn aan het aantal waardes in de
tuple, anders krijg je een ValueError. Dit is precies wat er in de
vorige les gebeurde bij for sleutel, waarde in leerling.items(): elke
ronde levert .items() een tuple, die je meteen uitpakt in twee namen.
Twee waardes returnen
Een functie kan maar één ding teruggeven — maar dat ene ding mag een tuple zijn. Zo geef je toch twee waardes terug:
def deel_met_rest(getal, deler):
return getal // deler, getal % deler
heel, rest = deel_met_rest(17, 5)
print(f"{heel} keer, rest {rest}") # 3 keer, rest 2
Bij return a, b maakt Python vanzelf een tuple, ook zonder haakjes.
De aanroeper pakt hem direct uit.
De swap
Twee variabelen wisselen kan met een hulpvariabele — maar met een tuple gaat het in één regel:
a = 1
b = 99
a, b = b, a
print(a, b) # 99 1
Python maakt eerst rechts de tuple (99, 1) en pakt die daarna links
uit. Geen waarde gaat verloren, want de tuple bestaat al voordat het
overschrijven begint.
Tuple of lijst?
| lijst | tuple | |
|---|---|---|
| Aanpassen na het maken | ja | nee |
| Lengte | groeit en krimpt | ligt vast |
| Gebruik | verzameling losse items | waardes die bij elkaar horen |
Vuistregel: een rij dingen van hetzelfde soort (namen, getallen) is een lijst; een klein groepje waardes dat samen één ding beschrijft (een coördinaat, een naam-met-score) is een tuple.
Opdracht 12.1: Coördinaat uitpakken
Hieronder staat een coördinaat. Pak hem uit in x en y en print de
regel hieronder.
Verwachte uitvoer:
Het punt ligt op x=4 en y=7
punt = (4, 7) # Schrijf hier je code
Klik hier voor een tip.
x, y = punt zet de eerste waarde in x en de tweede in y. Gebruik
daarna een f-string.
Klik hier voor de oplossing.
punt = (4, 7)
x, y = punt
print(f"Het punt ligt op x={x} en y={y}")
punt = (4, 7)
x, y = punt
print(f"Het punt ligt op x={x} en y={y}")Opdracht 12.2: Kleinste en grootste tegelijk
Schrijf een functie kleinste_en_grootste(lijst) die een tuple
teruggeeft met eerst de kleinste en dan de grootste waarde. Gebruik
min() en max().
Verwachte uitvoer:
kleinste: 2, grootste: 9
getallen = [5, 2, 8, 9, 3] # Schrijf hier je code
Klik hier voor een tip.
return min(lijst), max(lijst) geeft beide terug in één tuple. Vang ze
op met klein, groot = kleinste_en_grootste(getallen).
Klik hier voor de oplossing.
getallen = [5, 2, 8, 9, 3]
def kleinste_en_grootste(lijst):
return min(lijst), max(lijst)
klein, groot = kleinste_en_grootste(getallen)
print(f"kleinste: {klein}, grootste: {groot}")
getallen = [5, 2, 8, 9, 3]
def kleinste_en_grootste(lijst):
return min(lijst), max(lijst)
klein, groot = kleinste_en_grootste(getallen)
print(f"kleinste: {klein}, grootste: {groot}")Opdracht 12.3: Scorelijst (uitdaging)
Hieronder staat een lijst met (naam, score)-tuples. Print voor elke
speler een regel, en wissel daarna de inhoud van eerste en laatste
zonder hulpvariabele.
Verwachte uitvoer:
Sara heeft 12 punten
Alex heeft 9 punten
Maria heeft 15 punten
eerste: Maria, laatste: Sara
scores = [("Sara", 12), ("Alex", 9), ("Maria", 15)]
eerste = "Sara"
laatste = "Maria"
# Schrijf hier je codeKlik hier voor een tip.
In de loop pak je elke tuple direct uit: for naam, punten in scores:.
De wissel is één regel met een komma aan beide kanten.
Klik hier voor de oplossing.
scores = [("Sara", 12), ("Alex", 9), ("Maria", 15)]
eerste = "Sara"
laatste = "Maria"
for naam, punten in scores:
print(f"{naam} heeft {punten} punten")
eerste, laatste = laatste, eerste
print(f"eerste: {eerste}, laatste: {laatste}")
scores = [("Sara", 12), ("Alex", 9), ("Maria", 15)]
eerste = "Sara"
laatste = "Maria"
for naam, punten in scores:
print(f"{naam} heeft {punten} punten")
eerste, laatste = laatste, eerste
print(f"eerste: {eerste}, laatste: {laatste}")En nu?
Nog één datatype: in les 13 leer je de set — een verzameling zonder dubbelen, handig om bij te houden wat je al gehad hebt.