02: Functies

We hebben al kennis gemaakt met een functie, namelijk print, een functie die iets afdrukt. Om een functie te laten werken gebruik je haar naam, gevolgd door een aantal argumenten die tussen haakjes (()) staan. Dat heet een functie-oproep. Dan doet de functie iets waarbij de argumenten een rol spelen. Wanneer er meerdere argumenten zijn worden ze gescheiden door komma's (,). Je kunt bijvoorbeeld meerdere argumenten geven aan print; het zal al de argumenten, met spaties ertussen, in die volgorde afdrukken. We laten dit zien in het voorbeeld hieronder.

Voorbeeld
Druk drie getallen af
De extra spaties in het programma hierboven hebben geen effect op de uitvoer. Extra spaties hebben ook geen betekenis in de meeste andere situaties. Ze hebben enkel betekenis op twee plaatsen: in een stuk tekst tussen aanhalingstekens, en aan het begin van een regel. Dit laatste heet inspringing (Eng.: indentation). Inspringing kan fouten veroorzaken (klik hier voor een voorbeeld) wanneer het niet correct wordt gebruikt. Over een paar lessen zul je voorbeelden zien van correct inspringen.

Er zijn twee mogelijke redenen om een functie op te roepen: omwille van haar neveneffecten of omwille van haar resultaatwaarde. De functie print is een voorbeeld van het eerste geval: je roept haar op omdat ze tekst afdrukt; tekst afdrukken is een voorbeeld van een neveneffect. Een voorbeeld van het tweede geval is de functie max: die drukt niets af en heeft ook geen andere neveneffecten. Het heeft dan ook geen zin haar op te roepen zonder meer: zo'n programma doet niets. Zo'n functie is enkel nuttig als je haar gebruikt op een plaats in het programma waar je normaal gezien een waarde zou schrijven, zoals bv. rechts van het gelijkteken in een toekenning, of als argument van een oproep van een andere functie. Als je dat doet, zal de resultaatwaarde van de functie-oproep (ook terugkeerwaarde (Eng.: return value) genoemd) gebruikt worden als toegekende waarde of argument voor de andere oproep. Als je de functie max oproept, is de resultaatwaarde de waarde van het grootste meegegeven argument. We zeggen dat max haar grootste argument teruggeeft.

Voorbeeld
Probeer de uitvoer van het volgende programma te voorspellen, voor dat je het uitvoert.
Zo zeggen we bijvoorbeeld in het geval van de oproep max(42, 17) dat "de functie de waarde 42 teruggeeft".

De functie max heeft een tegenhanger: de functie min. Die geeft het minimum (kleinste) van al haar argumenten terug.

Meerkeuze-opgave: Min en Max I
Wat is de uitvoer van het volgende programma?

x = 13
y = 7
a = max(x+y, x*2)
b = min(x, y)
print(a, b)
Correct!

Functie-oproepen kunnen worden gecombineerd tot meer complexe uitdrukkingen.

Oefening met Kort Antwoord: Min and Max II
Wat is de uitvoer van het volgende programma?Hint

x = min(max(13, 7), 9)
print(x)
Correct!

Je hoeft je niet te beperken tot het gebruik van functies die in Python vooraf gedefinieerd zijn. Over een paar lessen zul je leren hoe je nieuwe functies kunt definiëren!

Veel voorkomende fouten

Wanneer je een functie aanroept met te weinig of te veel argumenten dan krijg je een foutmelding. Bijvoorbeeld, max vereist tenminste één argument:

Voorbeeld
Aanroepen van max met te weinig argumenten.

Het is belangrijk om zorgvuldig de foutmeldingen te lezen, wanneer je programma niet werkt. Python zal doorgaans bruikbare feedback geven over wat er mis ging. Soms is de foutmelding echter enigszins misleidend en moet je wat verder kijken om de oorzaak van het probleem te ontdekken. Hier volgt een voorbeeld.

Voorbeeld
Druk op Uitvoeren en kijk naar de fout die optreedt.

Python zegt dat er een syntax error optreedt, wat zoveel betekent als: ik begrijp niet wat je bedoelt.

 Traceback (most recent call last):
   In line 2 of the code you submitted:
     bigger = max(3, 4)
          ^
 SyntaxError: invalid syntax
De regel bigger = max(3, 4) is echter juist. Het probleem komt voort uit de vorige regel: we hebben daar het sluithaakje ) vergeten na smaller = min(14, 99 en Python begon op de volgende regel te zoeken naar ). Dus, kijk ook voor en na de regel die Python noemt, wanneer je vast komt te zitten bij het debuggen van je programma.

Oefening

Dit is een tweedelige oefening waarin gebruik gemaakt wordt van de functies min en max. Er zijn verbindingen tussen de steden Maxime en Miniac door middel van meerdere bruggen. Over elke brug kan een begrensde hoeveelheid lading getransporteerd worden.

Programmeeroefening: Eén weg
Voor deel 1 is er één enkele weg tussen de twee steden. De weg kent drie bruggen met maximale belasting a, b, c, zoals in de tekening beneden te zien is:

Om de route te kunnen volgen moet je truck eerst over de brug met maximale belasting a, dan over de brug met maximale belasting b, en dan over de brug met maximale belasting c. Je truck zal verongelukken wanneer ook maar één van de drie maximale belastingen wordt overschreden. Schrijf een programma dat de maximale vracht afdrukt die met je truck in één keer kan worden getransporteerd. Je programma mag ervan uitgaan dat de variabelen a, b, en c reeds de maximale mogelijke belasting per brug bevatten.

Programmeeroefening: Twee wegen
Deel 2: Nu gaan we het hele verhaal vertellen. Er is ook een tweede route die uit twee bruggen bestaat, de eerste met maximale belasting d, en de tweede met maximale belasting e, zoals je kunt zien in de tekening beneden.

Je kunt met je truck één van beide routes kiezen. Schrijf een programma dat dat de maximale vracht afdrukt die met je truck in één keer kan worden getransporteerd. Je programma mag ervan uitgaan dat de variabelen a, b, c, d, en e reeds de maximale mogelijke belasting per brug bevatten. Hint

Oefening: Klik en sleep

Hier volgt een klik-en-sleep-oefening waarbij de regels in een correcte volgorde versleept dienen te worden.

Volgorde-oefening: (klik en sleep) Sorteer
Zet de regels van het programma zodanig dat de waarden voor x, y en z zo worden afgedrukt, dat de kleinste eerst wordt afgedrukt, dan de middelste en tenslotte de grootste.
Versleep de regels met je muis.
  • print(max(x, y, z))
  • print(min(x, y, z))
  • print(x+y+z-min(x, y, z)-max(x, y, z))

Wanneer je de oefeningen hierboven af hebt, heb je twee keuzes:

  • Je kunt onmiddellijk naar Les 3, of
  • je kunt een paar extra oefeningen doen over functies in Les 2X.