Overstappen
reis geeft nu de weg als lijst paren. Omdat bij elke halte de lijn staat,
kun je meer zeggen dan alleen hoeveel haltes het is. Zo kun je tellen hoe vaak
je moet overstappen: elke keer dat de lijn verandert.
Voorspel
weg = [("blauw", "Markt"), ("rood", "Haven"), ("rood", "Strand")]
vorige_lijn = None
for lijn, station in weg:
if lijn != vorige_lijn:
print("Neem", lijn)
vorige_lijn = lijn
Wat print dit programma?
Antwoord
Neem blauw
Neem rood
Bij Haven verandert de lijn, bij Strand niet. De eerste keer is vorige_lijn
nog None, en dat is nooit gelijk aan een lijn.
Zo werkt het
Om te zien of de lijn verandert, onthoud je de lijn van de vorige halte in
vorige_lijn. Is de lijn anders, dan stap je over. Alleen bij de eerste halte
niet: daar stap je in. Daarom begint vorige_lijn met None, en tel je een
overstap alleen als vorige_lijn is not None.
Bouw zelf: hoe vaak overstappen?
Schrijf een functie overstappen(weg) die telt hoe vaak je op een weg moet
overstappen. Van Zuid naar Museum zijn het er 2, naar Strand 1 en naar Markt 0.
2
1
0
Begin klein, en breid de code stap voor stap uit:
- Draai de code. In de editor staat
reisuit de vorige stap; hij print de weg van Zuid naar Museum. - Loop met
for lijn, station in weg:langs de weg, en print bij elke haltelijn. Je ziet blauw, rood en geel. - Tel de overstappen, met
vorige_lijnuit het voorspel, en print het aantal. Voor Museum is het 2. - Maak er een functie
overstappen(weg)van die het aantal teruggeeft, en test hem ook metreis("Zuid", "Strand")enreis("Zuid", "Markt").
Het netwerk staat in de verborgen code. Wil je je eigen netwerk proberen, zet
dan een eigen lijst verbindingen boven reis: die vervangt de lijst uit de
verborgen code.
Tip
Telt hij er één te veel? Dan telt hij ook het instappen bij de eerste halte.
Antwoord
Dit komt onder reis in de editor, in plaats van de twee regels met weg:
def overstappen(weg):
aantal = 0
vorige_lijn = None
for lijn, station in weg:
if vorige_lijn is not None and lijn != vorige_lijn:
aantal = aantal + 1
vorige_lijn = lijn
return aantal
print(overstappen(reis("Zuid", "Museum")))
print(overstappen(reis("Zuid", "Strand")))
print(overstappen(reis("Zuid", "Markt")))
2
1
0
reis zoekt de weg met de minste haltes, niet die met de minste
overstappen. Wil je zo min mogelijk overstappen, dan moet je zoeken op een
ander netwerk: een waarin elke lijn één stap is.
Er gaat iets mis
TypeError: 'NoneType' object is not iterable
Oorzaak: er is geen weg, dus reis gaf None. Een loop over None kan
niet: er zit niets in om langs te lopen. Dat gebeurt bij
overstappen(reis("Zuid", "Eiland")).
Oplossing: kijk eerst of er een weg is.
# FOUT
weg = None
for lijn, station in weg:
print(lijn)
# GOED
weg = None
if weg is None:
print("Er is geen verbinding")
else:
for lijn, station in weg:
print(lijn)
Door naar aan de slag met Degrees.