Mutabiliteit en algoritmeontwerp¶
Week 5 liet zien hoe je een raster doorloopt. Nu leer je een lijst veranderen en hoe je voorkomt dat tussenstappen elkaar per ongeluk beïnvloeden.
Eerst directe mutatie¶
Een lijst is veranderbaar (mutable): bord[rij][kolom] = waarde verandert
het bestaande bord. Dat is handig wanneer één cel moet worden bijgewerkt. De
volgorde is bewust: eerst het vermogen, daarna de valkuil.
bord = [[0, 0], [0, 0]]
bord[0][1] = 1
assert bord == [[0, 1], [0, 0]]
Een lijst is veranderbaar, een tuple niet¶
Een lijst kun je op een positie wijzigen. Een tuple kun je wel lezen en uitpakken,
maar niet op een positie wijzigen. Voorspel eerst wat er gebeurt en voer daarna
het voorbeeld uit. De try-except vangt de verwachte fout op, zodat de les
verder kan gaan.
lijst = [1, 2]
lijst[0] = 9
assert lijst == [9, 2]
punt = (1, 2)
try:
punt[0] = 9
except TypeError:
print("Een tuple is onveranderlijk: een element kan niet worden toegewezen.")
assert punt == (1, 2)
Een tuple is onveranderlijk: een element kan niet worden toegewezen.
Verwijzingen en kopiëren¶
Bij ander = bord verwijzen twee namen naar dezelfde lijst. Een wijziging via de ene naam zie je via de andere. Een onafhankelijke rasterkopie maakt voor iedere rij een nieuwe lijst:
bord = [[0, 0], [0, 0]]
kopie = []
for rij in bord:
kopie = kopie + [rij[:]]
kopie[0][0] = 1
assert bord == [[0, 0], [0, 0]]
Deelprobleem en functiecompositie¶
Een algoritme wordt hanteerbaar als elke functie één deelprobleem oplost. In de basis tellen count_neighbors en next_cell eerst afzonderlijk; next_generation composeert die functies. Schrijf bij iedere functie de invoer, uitvoer en een kleine assertion voordat je verdergaat.
Tuple en uitpakken¶
Een tuple kan twee samenhangende waarden teruggeven. Deze week is één vorm genoeg:
def midden_van(bord):
return (len(bord) // 2, len(bord[0]) // 2)
rij, kolom = midden_van([[0, 0, 0], [0, 1, 0], [0, 0, 0]])
assert (rij, kolom) == (1, 1)
Dictionaries, methoden en het Markov-model komen in PGM2 week 1. Daar worden tupleparen opnieuw gebruikt bij het doorlopen van dictionary-items.