Een functie voorspel
Je zoekt nu de dichtstbijzijnde buur met een loop, voor één stuk fruit. Wil
je tien stukken fruit indelen, dan schrijf je die loop niet tien keer op. Je
stopt hem in een functie, en roept die aan voor elk stuk fruit. Let daarbij
op één ding: waar de return staat.
Voorspel
def kleinste(getallen):
beste = 1000
for g in getallen:
if g < beste:
beste = g
return beste
print(kleinste([5, 2, 8]))
De functie moet het kleinste getal teruggeven. Wat print dit programma?
Antwoord
5
De return staat in de loop. Bij het eerste getal, 5, geeft de functie al
antwoord, en dan is hij klaar. De 2 bekijkt hij nooit.
Zo werkt het
Een return stopt de functie meteen, ook midden in een loop. Een functie die
de beste uit een lijst zoekt, zet de return dus na de loop: één niveau
minder ver ingesprongen, onder de for.
Je functie voorspel krijgt twee parameters: het nieuwe fruit en de lijst
voorbeelden. Zo werkt hij ook met een andere lijst voorbeelden, zoals de
honden en katten in de volgende stap.
Opdracht: een functie voorspel
Maak een functie voorspel(nieuw, voorbeelden) die de soort van de
dichtstbijzijnde buur teruggeeft. Test hem zo:
print(voorspel((10, 7), voorbeelden)) # appel
print(voorspel((15, 5), voorbeelden)) # banaan
Begin klein, en breid de code stap voor stap uit:
- Draai de code:
voorspelgeeft nog"?"terug. - Loop in de functie over de voorbeelden, en print met
afstandhoe ver elk voorbeeld weg is. - Onthoud met een
ifde kleinste afstand en de soort die erbij hoort, zoals in de vorige stap. Haal de print weg, en geef de soort terug.
In de editor staan afstand, de voorbeelden en een functie die nog niets doet.
Tip
De loop uit de vorige stap past bijna zo in de functie: begin met
beste_afstand = 1000, en geef beste_soort aan het eind terug. Kijk na
stap 3 goed naar de inspringing van de return.
Antwoord
def afstand(a, b):
return abs(a[0] - b[0]) + abs(a[1] - b[1])
def voorspel(nieuw, voorbeelden):
beste_afstand = 1000
beste_soort = ""
for maten, soort in voorbeelden:
d = afstand(nieuw, maten)
if d < beste_afstand:
beste_afstand = d
beste_soort = soort
return beste_soort
voorbeelden = [
((8, 8), "appel"),
((9, 8), "appel"),
((7, 7), "appel"),
((18, 4), "banaan"),
((20, 4), "banaan"),
((17, 3), "banaan"),
]
print(voorspel((10, 7), voorbeelden)) # appel
print(voorspel((15, 5), voorbeelden)) # banaan
Staat de return in de loop, dan geeft de functie al na het eerste
voorbeeld een antwoord, en kijkt hij nooit verder.
Er gaat iets mis
TypeError: voorspel() missing 1 required positional argument: 'voorbeelden'
Oorzaak: voorspel heeft twee parameters, en je gaf hem er één: alleen
het nieuwe fruit. Python weet dan niet in welke lijst hij moet zoeken.
Oplossing: geef de lijst voorbeelden mee als tweede argument.
# FOUT
voorspel((10, 7))
# GOED
voorspel((10, 7), voorbeelden)
Door naar hond of kat.