Python Cursus. Hoofdstuk 8 - Eigen Functies
Uitwerkingen
Terug naar de uitleg en gewone opgaven over Eigen FunctiesTerug naar de cursus pagina
Opgave 8.2.1A Een functie aanroepen
import turtle #FUNCTIE DEFINITIE #Definitie: Instructies voor het tekenen van een vierkant met grootte van 20 def tekenVierkant( ): turtle.forward( 20 ) turtle.right(90) turtle.forward( 20 ) turtle.right(90) turtle.forward( 20 ) turtle.right(90) turtle.forward( 20 ) turtle.right(90) #HOOFDPROGRAMMA MET AANROEP VAN FUNCTIE turtle.pendown() tekenVierkant()#Aanroep: teken een vierkant turtle.right(45) tekenVierkant() #Aanroep: teken een vierkant turtle.done()
Opgave 8.2.1B Een eigen functie maken: TekenSnoep
import turtle #FUNCTIEDEFINITIES #teken snoep def tekenSnoep(): turtle.fillcolor("red") turtle.begin_fill() turtle.circle(30) turtle.end_fill() #teken stok def tekenStok(): turtle.right(90) turtle.forward(100) #HOOFDPROGRAMMA turtle.pendown() tekenSnoep() tekenStok() turtle.done()
Opgave 8b.1 Figuurtje tekenen
- Functie tekenFiguur tekent een vierkant met zijdes van lengte 100.
- Nee, geen parameters.
- Nee, het heeft geen
return
en levert dus geen informatie op dat later in het programma gebruikt kan worden. - Het programma tekent een spirograaf door 80 vierkantjes achter elkaar te tekenen, ieder telkens 35 graden gedraaid ten opzichte van de vorige.
- ...
- Zonder de functie
tekenVierkant
zou je 4*2=8 keer de regelturtle.forward(100)
moeten intikken.
Opgave 8.2.2.1AA Gegroet
#FUNCTIE DEFINITIE groet( naam ): print( "Hallo " + naam + "!" ) groet( "Piet" ) groet( "Janneke" ) groet( "Tycho" )
Opgave 8.2.2.1A Teken vierkant met parameters
import turtle #FUNCTIE DEFINITIE #Definitie: Instructies voor het tekenen van een vierkant met grootte van 20 def tekenVierkant( grootte ): turtle.forward( grootte ) turtle.right(90) turtle.forward( grootte ) turtle.right(90) turtle.forward( grootte ) turtle.right(90) turtle.forward( grootte ) turtle.right(90) #HOOFDPROGRAMMA MET AANROEP VAN FUNCTIE turtle.pendown() tekenVierkant(20) #Aanroep: teken een vierkant van grootte 20 turtle.right(45) tekenVierkant(40) #Aanroep: teken een vierkant van grootte 40 turtle.done()
Opgave 8.2.2.1B Teken lolly met parameters
import turtle #FUNCTIEDEFINITIES #teken snoep def tekenSnoep( straal ): #DEEL B.1: pas hier de definitie aan turtle.fillcolor("red") turtle.begin_fill() turtle.circle( straal ) #DEEL B.2: pas hier de parameter aan turtle.end_fill() #teken stok def tekenStok( lengte_stok ): turtle.right(90) turtle.forward( lengte_stok ) #HOOFDPROGRAMMA turtle.pendown() tekenSnoep( 40 ) #DEEL B.3: pas hier de straal aan tekenStok( 50 ) #DEEL A: pas hier de lengte van het stokje aan turtle.done()
Opgave 8.2.2.1 Bereken cijfer met parameters
#FUNCTIE DEFINITIE def berekenCijfer( score ): cijfer = score / 60 * 9 + 1 print( cijfer ) #HOOFDPROGRAMMA MET AANROEP VAN FUNCTIE berekenCijfer(40)
Opgave 8.2.2.3 Lolly kleur en maat: Functie met 2 parameters
import turtle #FUNCTIEDEFINITIES #teken snoep def tekenSnoep( straal, kleur ): turtle.fillcolor( kleur ) turtle.begin_fill() turtle.circle( straal ) turtle.end_fill() #teken stok def tekenStok( lengte_stok ): turtle.right(90) turtle.forward( lengte_stok ) #HOOFDPROGRAMMA turtle.pendown() tekenSnoep( 40, "blue" ) tekenStok( 100 ) turtle.done()
Opgave 8b.4 Korting berekenen
1. Het programma berekend de nieuwe prijs van een artikel, gegeven de oude prijs en kortingspercentage. 2. berekenKorting#FUNCTIE DEFINITIE def berekenKorting(oude_prijs, perc_korting): korting = oude_prijs * perc_korting/100 nieuwe_prijs = oude_prijs - korting return nieuwe_prijs #HOOFDPROGRAMMA prijs_met_korting = berekenKorting(20.00, 30) print("Met korting kost het product nu " + str(prijs_met_korting) + " euro" )4. De variabele
korting
wordt aangemaakt op regel 3. Omdat het binnen de functie wordt aangemaakt, bestaat het niet meer na afloop van het programma. Dus, na regelnummer 5 bestaat het niet meer en kun je het niet meer gebruiken. Hetzelfde geldt voor de andere variabelen die in de functie worden aangemaakt. Daarom is het nodig om de nieuwe_prijs
te retourneren zodat het daarna nog gebruikt kan worden (in de print).
Opgave 8.2.1 Bereken cijfer
#FUNCTIE DEFINITIE def berekenCijfer(aantal_punten): cijfer = (aantal_punten * 9) / 60 + 1 return( cijfer ) #HOOFDPROGRAMMA MET AANROEP VAN FUNCTIE behaalde_cijfer = berekenCijfer( 40 ) print(behaalde_cijfer)
Opgave 8.2.6 Volume van een balk
#VARIABELEN EN CONSTANTEN lengte = 4 breedte = 3 hoogte = 5 #FUNCTIE DEFINITIE #deze functie levert de volume van een balk op #parameters zijn de lengte, breedte en hoogte def berekenVolumeBalk ( lengte, breedte, hoogte ): volume = lengte * breedte * hoogte return volume #HOOFDPROGRAMMA MET AANROEP VAN FUNCTIE berekendeVolume = berekenVolumeBalk( lengte, breedte, hoogte ) print( "De volume van de balk is", berekendeVolume )
Opgave 8.2.7.1 Omrekenen Celsius naar Fahrenheit
#VARIABELEN EN CONSTANTEN temperatuur_in_F = 96.3 #FUNCTIE DEFINITIE def fahrenheitNaarCelsius( temp_fahrenheit ): temp_celsius = ((temp_fahrenheit) - 32) * 5/9 temp_celsius = round( temp_celsius, 1 ) return temp_celsius #HOOFDPROGRAMMA MET AANROEP VAN FUNCTIE temperatuur_in_celcius = fahrenheitNaarCelsius( temperatuur_in_F ) print("Temperatuur in Celsius is:", temperatuur_in_celcius)
Opgave 8.2.7.2 Gevoelstemperatuur
#FUNCTIE DEFINITIE #Deze functie geeft een opmerking over gevoelstemperatuur terug bij invoer van graden in Celsius def gevoelsTemperatuur( temperatuur ): if temperatuur < -50: return "Zo koud kan het nooit zijn!" elif temperatuur < -10: return "Dat is koud." elif temperatuur < 10: return "Dat is fris." elif temperatuur < 50: return "Dat is warm." else: return "Zo warm kan het nooit zijn!" #HOOFDPROGRAMMA MET AANROEP VAN FUNCTIE gevoel = gevoelsTemperatuur( 35.7 ) # temperatuur in celsius print ("Gevoelstemperatuur is", gevoel)
Opgave 8.2.7.3 Fahrenheit omgezet in Celsius en gevoelstemperatuur
#VARIABELEN EN CONSTANTEN temperatuur_in_fahrenheit = 96.3 #FUNCTIE DEFINITIES #Deze functie rekent een temperatuur in Fahrenheit om naar Celsius def fahrenheitNaarCelsius( temp_fahrenheit ): temp_celsius = ((temp_fahrenheit) - 32) * 5/9 temp_celsius = round( temp_celsius, 1 ) return temp_celsius #Deze functie geeft een opmerking over gevoelstemperatuur terug bij invoer van graden in Celsius def gevoelsTemperatuur( temperatuur ): if temperatuur < -50: return "Zo koud kan het nooit zijn!" elif temperatuur < -10: return "Dat is koud." elif temperatuur < 10: return "Dat is fris." elif temperatuur < 50: return "Dat is warm." else: return "Zo warm kan het nooit zijn!" #HOOFDPROGRAMMA MET AANROEP VAN FUNCTIES temperatuur_in_celcius = fahrenheitNaarCelsius( temperatuur_in_fahrenheit ) print("Temperatuur in Celsius is:", temperatuur_in_celcius) gevoel = gevoelsTemperatuur( temperatuur_in_celcius ) print ("Gevoelstemperatuur is", gevoel) print( temperatuur_in_fahrenheit, "graden Fahrenheit is", temperatuur_in_celcius, "graden Celsius.", gevoel)
Opgave 8.2.9 Dorp tekenen: Functies aanroepen vanuit andere functies
DEEL A.import turtle #FUNCTIE DEFINITIES #Tekent zwarte vierkant def tekenMuren(): turtle.forward(150) turtle.right(90) turtle.forward(150) turtle.right(90) turtle.forward(150) turtle.right(90) turtle.forward(150) #Tekent een rood gevulde dak def tekenDak(): turtle.fillcolor("red") turtle.begin_fill() turtle.right(30) turtle.forward(150) turtle.right(120) turtle.forward(150) turtle.end_fill() #Tekent een huis bestaande uit muren en een dak def tekenHuis(): tekenMuren() tekenDak() #HOOFDPROGRAMMA tekenHuis() turtle.done()DEEL B.
import turtle #FUNCTIE DEFINITIES #Tekent zwarte vierkant def tekenMuren(): turtle.forward(150) turtle.right(90) turtle.forward(150) turtle.right(90) turtle.forward(150) turtle.right(90) turtle.forward(150) #Tekent een rood gevulde dak def tekenDak(): turtle.fillcolor("red") turtle.begin_fill() turtle.right(30) turtle.forward(150) turtle.right(120) turtle.forward(150) turtle.end_fill() #Tekent een huis bestaande uit muren en een dak def tekenHuis(): tekenMuren() tekenDak() #HOOFDPROGRAMMA tekenHuis() #verplaats pen naar nieuwe plaats en in juiste richting turtle.penup() turtle.setposition(250, 0) turtle.setheading(0) turtle.pendown() tekenHuis() #verplaats pen naar nieuwe plaats en in juiste richting turtle.penup() turtle.setposition(-250, -250) turtle.setheading(0) turtle.pendown() tekenHuis() turtle.done()
Opgave 8.2.10.1 isEven
#FUNCTIE DEFINITIE def isEven(getal): if getal%2 == 0: return True else: return False #HOOFDPROGRAMMA MET AANROEP VAN FUNCTIE antwoord = isEven(4) print(antwoord) antwoord = isEven(1) print(antwoord) antwoord = isEven(0) print(antwoord)
Opgave 8.3.1.1 Scope van variabelen
Bij deel A: Zowel `dubbeltje` als `kwartje` zijn zichtbaar in de functie `geboren()`, omdat ze gedefinieerd zijn voordat de functie is aangeroepen, en omdat het blok code van de functie op een dieper niveau van inspringing zit. Bij deel B: De variabele `kwartje` lijkt een nieuwe waarde 5 te krijgen in de functie `geboren()`, wat ertoe leidt dat de functie nu claimt dat je na je geboorte niet minder waard kunt worden. Maar als daarna in het hoofdprogramma de waarde van `kwartje` wordt afgedrukt, zie je dat deze variabele nog steeds het woord 25 bevat. Toelichting De reden voor het verschil is dat de variabele `kwartje` in de functie een andere is dan de variabele `kwartje` in het hoofdprogramma. Door in een functie een waarde toe te kennen aan een variabele, wordt een nieuwe, "lokale" variabele gecreëerd. En deze variabele wordt dan gebruikt voor de rest van de functie. De originele variabele `kwartje` bestaat nog steeds, maar is onzichtbaar geworden voor de functie omdat de functie een eigen variabele `kwartje` heeft gemaakt.Opgave 8.3.1.2 Levensduur van variabelen
De drie functies `printfruit_1()`, `printfruit_2()`, en `printfruit_3()` printen de waardes van de variabelen `appel` en `banaan`. In `printfruit_1()` worden de variabelen `appel` en `banaan` geprint die gedefinieerd zijn buiten de functie, aangezien de functie zelf geen variabelen met deze namen definieert. In `printfruit_2()`, is `appel` een parameter van de functie, wat betekent dat de variabele lokaal is voor de functie en, omdat het een parameter is, zijn waarde krijgt van buiten de functie. De waarde de parameter krijgt is de waarde van `kers`. `banaan` is een variabele die zijn waarde krijgt in de functie. Dit is daarom een nieuwe, lokale variabele `banaan`, die niks te maken heeft met de variabele banaan in het hoofdprogramma. Deze variabele krijgt de waarde van de variabele `kers`, die niet lokaal bekend is in de functie, dus wordt de variabele `kers` van het hoofdprogramma gebruikt. Dus krijgt de lokale variabele `banaan` de waarde "kers," en dat is dus de waarde die geprint wordt. In printfruit_3() zijn `appel` en `banaan` beide parameters, dus beide zijn lokaal voor de functie en krijgen hun initiële waarde bij de aanroep van de functie. De functie creëert een lokale variabele `kers`, die onafhankelijk is van de variabele `kers` uit het hoofdprogramma, en geeft deze variabele de waarde "mango". De variabele `banaan` krijgt vervolgens de waarde van `kers`. Omdat al deze wijzigingen gemaakt worden met lokale variabelen, hebben ze geen invloed op de waardes van de variabelen in het hoofdprogramma. Waar het hier vooral om gaat is het feit dat, na de aanroep van functies die op allerlei manieren met de parameters spelen en die lokale variabelen aanmaken met dezelfde namen als variabelen in het hoofdprogramma, uit het afdrukken van de variabelen in het hoofdprogramma blijkt dat die allemaal nog steeds dezelfde waarde hebben als ze hadden voordat de functies werden aangeroepen. Zodra je probeert in een functie een variabele die bestaat in het hoofdprogramma een andere waarde te geven middels een assignment, wordt in plaats daarvan een nieuwe, lokale variabele gecreëerd. Een dergelijke lokale variabele is compleet onafhankelijk van het hoofdprogramma. De levensduur van zo’n lokale variabele is de periode dat de functie wordt uitgevoerd. Parameters kun je ook beschouwen als lokale variabelen. Dit is een enorm krachtige eigenschap van functies: ze hoeven geen rekening te houden met variabelen die bestaan buiten de functie, aangezien iedere variabele die ze creëren lokaal is voor de functie.Opgave 8.3.2 Constanten
Constanten zijn bijvoorbeeld jullie namen en het kopje "keren gewonnen", die veranderen niet gedurende het spel. Variabelen zijn bijvoorbeeld de huidige score, die veranderd gedurende het spel.Opgave 8.3.1.3 Globale variabelen
# GLOBALE VARIABELEN aantal_fietsen = 0 # globale variable #DEFINITIES def verhoogAantalFietsen(): global aantal_fietsen # maak gebruik van de globale variabele aantal_fietsen = aantal_fietsen + 2 # verhoog met 2 #HOOFDPROGRAMMA verhoogAantalFietsen() # roep functie aan print("Waarde van aantal_fietsen is:", aantal_fietsen)
Opgave 8.4 Volume van een balk met foutafhandeling
#VARIABELEN EN CONSTANTEN lengte_eerste_zijde = 4 lengte_tweede_zijde = 3 lengte_derde_zijde = 5 #FUNCTIE DEFINITIE #deze functie levert de volume van een balk op #parameters zijn de lengte, breedte en hoogte #levert -1 op bij ongeldige invoer (parameter waarden 0 of kleiner) def volumeBalk ( lengte, breedte, hoogte ): if lengte <= 0 or breedte <= 0 or hoogte <=0: return -1 else: volume = lengte * breedte * hoogte return volume #HOOFDPROGRAMMA MET AANROEP VAN FUNCTIE volume = volumeBalk( lengte_eerste_zijde, lengte_tweede_zijde, lengte_derde_zijde ) #antwoord afdrukken if volume == -1: print( "De getallen kunnen niet worden gebruikt." ) #ongeldige invoer else: print( "De volume van de balk is", volume )
Optionele opgaven
OPTIONEEL Opgave 8.2.8 Oplosser voor kwadratische vergelijkingen
import math # Deze functie lost een kwadratische vergelijking op. # De parameters zijn numerieke waardes voor A, B, and C in de vergelijking Ax**2 + Bx + C = 0. Het retourneert drie waardes. # De eerste is een integer 0, 1, of 2, die aangeeft hoeveel oplossingen er zijn. Daarna volgen de oplossingen. # Zonder oplossingen zijn beide 0. 1 oplossing wordt geretourneerd als de eerste van de twee, en de tweede is 0. def wortelformule( a, b, c ): if a == 0: if b == 0: return 0, 0, 0 return 1, -c/b, 0 discriminant = b*b - 4*a*c if discriminant < 0: return 0, 0, 0 elif discriminant == 0: return 1, -b/(2*a), 0 else: return 2, (-b+ math.sqrt(discriminant))/(2*a), \ (-b- math.sqrt(discriminant))/(2*a) num, opl1, opl2 = wortelformule( float(input( "A: " )), float(input( "B: " )), float(input( "C: " )) ) if num == 0: print( "Er zijn geen oplossingen" ) elif num == 1: print( "Er is 1 oplossing, namelijk", opl1 ) else: print( "Er zijn 2 oplossingen, namelijk:", opl1, "en", opl2 )
OPTIONEEL Opgave 8.3.4 Module binomiaalcoëfficiënt
# Berekent de faculteit van de paremeter n, een integer. # Retourneert de uitkomst als integer. def faculteit( n ): waarde = 1 for i in range( 2, n+1 ): waarde *= i return waarde # Berekent n boven k; n en k zijn integer parameters; # Retourneert n boven k als integer (want dat is het altijd). def binomiaalcoefficient( n, k ): if k > n: return 0 antwoord = int( faculteit( n ) / (faculteit( k )*faculteit( n - k )) ) return antwoord def main(): print( faculteit( 5 ) ) print( binomiaalcoefficient( 8, 3 ) ) if __name__ == '__main__': main()
Afsluitende Opgaven
Afsluitende opgave 8.1 Functie voor tafel van vermenigvuldiging.
#FUNCTIE DEFINITIE # Functie voor tafel van vermenigvuldiging. # tafel krijgt een integer als parameter. Het drukt de tafel van vermenigvuldiging voor deze integer af. def tafel( n ): i = 1 while i <= 10: print( i, "*", n, "=", i*n ) i += 1 #HOOFDPROGRAMMA invoer = input( "Geef een getal: " ) ingevoerde_getal = int ( invoer ) tafel( ingevoerde_getal )
Afsluitende opgave 8.3 Vind de fout
De functie moet wat retourneren, niet alleen afdrukken. Omdat het niets retourneert, wordt 'None' afgedrukt.#FUNCTIE DEFINITIE def oppervlakte_van_driehoek( basis, hoogte ): opp = 0.5 * basis * hoogte print( "Een driehoek met", basis, "en hoogte", hoogte, "heeft oppervlakte", opp ) return opp #HOOFDPROGRAMMA MET AANROEP VAN FUNCTIE berekende_oppervlakte = oppervlakte_van_driehoek( 4.5, 1.0 ) print( berekende_oppervlakte )
Afsluitende opgave 8.4 Munt opgooien
import random #FUNCTIE DEFINITIE def gooiMunt(): random.seed() random_getal = random.randint (0, 1) if random_getal == 0: return("KOP") else: return("MUNT") #HOOFDPROGRAMMA MET AANROEP VAN FUNCTIE opgegooid = gooiMunt() print( opgegooid() )
Afsluitende opgave 8.5 Olympische Ringen
import turtle #FUNCTIE DEFINITIE def tekenGekleurdeRing(kleur, x_coor, y_coor): turtle.penup() turtle.setposition(x_coor, y_coor) turtle.pendown() turtle.pencolor(kleur) turtle.circle(50) #HOOFDPROGRAMMA tekenGekleurdeRing("blue",0,0) tekenGekleurdeRing("purple",-120,0) tekenGekleurdeRing("red",60,60) tekenGekleurdeRing("yellow",-60,60) tekenGekleurdeRing("green",-180,60) turtle.done()
Afsluitende opgave 8.6 BMI
#FUNCTIE DEFINITIES #schrijf hier je def voor BMI berekenen def BMI_berekenen (aantal_m, aantal_kg): BMI = aantal_kg/(aantal_m * aantal_m) return BMI #bepaal de gezondheidscategorie bij BMI def categorie_bepalen(BMI): if BMI <= 18.5: return "te licht" elif BMI > 18.5 and BMI < 25: return "gezond" else: #BMI>= 25: return "te zwaar" #HOOFD PROGRAMMA #vraag hier de gebruiker om zijn gegevens lengte = float(input("Hoe lang ben je (in meters)?")) gewicht = float(input("Hoeveel weeg je (in kg)?")) #roep hier je functie aan voor het berekenen van de BMI berekende_BMI = BMI_berekenen (lengte, gewicht) print("BMI:", berekende_BMI) categorie = categorie_bepalen(berekende_BMI) print("Categorie:", categorie)
Afsluitende opgave 8.7 Wat voor een getal?
#FUNCTIE DEFINITIE #Bepaald of een getal 0, pos of negatief is. def bepaalSoortGetal( getal ): if getal < 0: print("Het getal "+ str(getal) +" is kleiner dan 0.") elif getal == 0: print("Het getal "+ str(getal) +" is gelijk aan 0.") else: print("Het getal "+ str(getal) +" is groter dan 0.") #HOOFDPROGRAMMA MET AANROEP VAN FUNCTIE bepaalSoortGetal(-1) bepaalSoortGetal(0) bepaalSoortGetal(1)
Afsluitende opgave 8.8 De wielen van de bus
#FUNCTIE DEFINITIE def zingCouplet( onderdeel, actie ): print( "De " + onderdeel + " van de bus " + actie ) print( actie +", " + actie ) print( "De " + onderdeel + " van de bus " + actie ) print( "Als de bus gaat rijden" ) print("\n") #HOOFDPROGRAMMA MET AANROEP VAN FUNCTIE zingCouplet("wielen", "draaien rond") zingCouplet("deuren", "gaan open en dicht") zingCouplet("wissers", "gaan heen en weer") zingCouplet("lichten", "gaan aan en uit") ```
Terug naar de uitleg en gewone opgaven over Eigen Functies
Naar de afsluitende opgaven over Eigen Functies
Terug naar de cursus pagina