Ga naar hoofdinhoud

Duizend klikken

Bij tien klikken zie je welke wegen de surfer loopt. Welke pagina het belangrijkst is, zie je pas als je telt, net als bij de dobbelsteen: laat hem duizend keer klikken, en tel hoe vaak hij op elke pagina komt.

Voorspel​

bezocht = {"A": 0, "B": 0, "C": 0, "D": 0}
for pagina in ["A", "C", "A", "B", "C"]:
bezocht[pagina] = bezocht[pagina] + 1

print(bezocht)
print(bezocht["A"] / 5)

Wat print dit?

Antwoord
{'A': 2, 'B': 1, 'C': 2, 'D': 0}
0.4

A staat twee keer in de lijst van vijf, dus de surfer was 0,4 van de tijd op A.

Zo werkt het​

De dictionary bezocht telt hoe vaak de surfer op elke pagina komt. Met for p in web: zet je eerst elke pagina op 0. Deel je de telling door het aantal klikken, dan weet je welk deel van de tijd hij op elke pagina doorbrengt.

Onderzoek​

  1. Draai de code. Welke pagina's zijn het populairst?
  2. Pagina D krijgt 0. Waarom?
  3. Laat de surfer op D beginnen: pagina = "D". Krijgt D nu wel bezoek?
  4. Zet "E": [] in het web, en laat C naar A én E linken: "C": ["A", "E"]. Wat gebeurt er als je de code draait?
Python
Code-omgeving wordt voorbereid…
Antwoorden
  1. A en C, allebei rond de 0,4. B krijgt ongeveer 0,2: alleen A linkt naar B, en vanaf A gaat de surfer maar de helft van de keren naar B.
  2. Geen enkele pagina linkt naar D. De surfer komt er dus nooit.
  3. Nee. De loop telt een pagina pas als de surfer er na een klik op uitkomt. Vanaf D klikt hij naar C, en daarna komt hij nooit meer terug.
  4. Python stopt met een foutmelding, zie Er gaat iets mis. Zodra de surfer op E komt, staat hij op een pagina zonder links, en random.choice kan uit een lege lijst niets kiezen.

Opdracht: de populairste pagina​

Een zoekmachine zet de populairste pagina bovenaan. Zoek in de telling van een surfer de pagina met het meeste bezoek, en print hem:

C is het populairst

Begin klein, en breid de code stap voor stap uit:

  1. Draai de code: hij print elke pagina met haar telling.
  2. Houd de beste pagina tot nu toe bij: zet vóór de loop beste = "A", en zet in de loop beste = p als bezocht[p] groter is dan bezocht[beste]. Print na de loop de zin met beste erin.
  3. Verander de telling van B in 500, en draai opnieuw. Nu moet B bovenaan staan.
Python
Code-omgeving wordt voorbereid…
Tip

Zegt hij altijd A? Kijk of je bezocht[p] vergelijkt met bezocht[beste], en niet met beste zelf: beste is de naam van een pagina, geen getal.

Antwoord
bezocht = {"A": 401, "B": 196, "C": 403, "D": 0}

beste = "A"
for p in bezocht:
print(p, bezocht[p])
if bezocht[p] > bezocht[beste]:
beste = p

print(beste, "is het populairst")

C wint net van A. Bij een volgende run van de surfer kan het andersom zijn: ze liggen allebei rond de 0,4.

Er gaat iets mis​

IndexError: Cannot choose from an empty sequence

Oorzaak: de surfer staat op een pagina zonder links. web[pagina] is dan een lege lijst, en random.choice kan uit een lege lijst niets kiezen.

Oplossing: geef elke pagina minstens één link, of laat de surfer springen als er geen links zijn.

# FOUT
import random
web = {"A": ["E"], "E": []}
pagina = random.choice(web["E"])

# GOED
import random
web = {"A": ["E"], "E": []}
if len(web["E"]) > 0:
pagina = random.choice(web["E"])
else:
pagina = random.choice(list(web))

Door naar de surfer springt soms.