Python Cursus. Hoofdstuk 8 - Eigen Functies

Uitwerkingen

Terug naar de uitleg en gewone opgaven over Eigen Functies
Terug 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

  1. Functie tekenFiguur tekent een vierkant met zijdes van lengte 100.
  2. Nee, geen parameters.
  3. Nee, het heeft geen return en levert dus geen informatie op dat later in het programma gebruikt kan worden.
  4. Het programma tekent een spirograaf door 80 vierkantjes achter elkaar te tekenen, ieder telkens 35 graden gedraaid ten opzichte van de vorige.
  5. ...
  6. Zonder de functie tekenVierkant zou je 4*2=8 keer de regel turtle.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