Naar www.aaappp.nl/informatica of Praktijkopdracht programmeren in Python

Functies in Python

Je gaat leren programmeren in de programmeertaal Python. We doen dat met IDLE, de standaard IDE van Python.

Je begint met overtikken van wat op de plaatjes staat. Zo leer je omgaan met de Python-shell en de Python-editor. Daarna mag je code uit deze webpagina knippen en in de Python-editor plakken. Als je deze webpagina helemaal hebt doorgewerkt, heb je de belangrijkste mogelijkheden van IDLE gezien en weet je hoe je zelf functies kunt maakt en testen. In feite ben je dan al een echte programmeur!

Start IDLE

Op school is een oudere versie van Python geïnstalleerd, maar de Python-shell werkt hetzelfde. Achter de >>> prompt kan je berekeningen intoetsen bijna precies zoals je dat gewend bent met je rekenmachine. De Python-shell is een zogenaamde REPL-interpreter. REPL staat voor Read Eval Print Loop.

  1. Python leest wat jij intoetst.
  2. Als je afsluit met Enter, evalueert Python wat je hebt ingetoetst.
  3. Daarna print Python het resultaat.
  4. Python laat weer de >>> prompt zien en gaat verder bij 1. En zo voort.
Probeer dit uit. Merk op dat Python veel grotere getallen kan verwerken dan in het schermpje van je rekenmachine passen. Met Alt-p kan je bladeren in wat je eerder hebt ingetoetst. Zo kan je optellen, aftrekken, vermenigvuldigen en delen snel testen, want je gebruikt steeds dezelfde regel en je verandert alleen de + in - en daarna - in * en * in /.

Machtsverheffen doe je met ** en worteltrekken kan je doen met machtsverheffen tot de macht ½. De haakjes zijn noodzakelijk om aan te geven dat Python eerst moet delen daarna pas moet machtsverheffen. Dit werkt precies zo als op je rekenmachine!
Je rekenmachine daarentegen kent alleen A, B, C, D, E en F terwijl je met Python hele woorden kunt gebruiken als variabelen. In bovenstaand voorbeeld zie je kwadraat als variabele. Met de functie print met als argument een variabele, laat je de waarde van die variabele afdrukken.

Pythagoras versie 1

De Python-shell gebruik je om stukjes Python-code te testen. Python-programma's bestaan meestal uit vele regels code. Je gebruikt de Python-editor om Python-programma's te maken. Klik op File en New File dan verschijnt de Python-editor.

Definieer nu de functie langeZijde. Volgens de stelling van Pythagoras a2 + b2 = c2 bereken je de lange zijde c door de wortel te trekken uit de som van de kwadraten van de korte zijdes a en b.
Dit keer gaan we niet worteltrekken door machtsverheffen tot de macht ½. Worteltrekken is geen standaardfunctie van Python, daarom is import math nodig om de functie math.sqrt te kunnen gebruiken.

Je moet de functie langeZijde precies zo intoetsen, want anders werkt het niet. Indien je na de dubbele punt Enter intoetst, gaat de Python-editor automatisch naar de volgende regel met vier spaties aan het begin. Dat is de bedoeling volgens de syntax van Python. Alles na de dubbele punt met een vier spaties inspringen hoort bij de functie langeZijde. Alles wat op een nieuwe regel begint zonder inspringen hoort niet meer bij langeZijde. Meer voorbeelden volgen verder op deze webpagina.

Dit is voorlopig genoeg. Het is tijd om te testen of de functie langeZijde werkt. Druk op F5 of klik op Run en dan op Run Module F5. De Python-editor vraagt of je je werk wilt opslaan.

Zorg dat je je werk opslaat op H: in een map voor jouw Python-programma's. Noem het bestand bij voorbeeld Pythagoras1.py

Daarna kom je weer in de Python-shell en test je de functie langeZijde met als argumenten 3 en 4.

Pythagoras versie 2

Met Pythagoras kan je ook de korte zijde uitrekenen. En als je eerst de lange zijde hebt uitgerekend, kan je vervolgens met een lange zijde en een korte zijde de andere korte zijde terugrekenen. Het voorbeeld met minder mooie getallen is nauwkeurig tot op 13 cijfers achter de komma!

Het gaat echter fout als je de lange zijde en de korte zijde per ongeluk omwisselt, want dan probeer je de wortel te trekken uit een negatief getal. Python vertelt je precies waar in het programma het fout gaat.

Code knippen en plakken

Vanaf hier hoef je niet meer de code in te toetsen en kan je de code knippen vanuit deze webpagina en in de Python-editor plakken.

Bij informatica mag je afkijken! Goed kunnen zoeken met Google, onderzoeken wat je hebt gevonden en kunnen toepassen in eigen projecten zijn belangrijke vaardigheden van professionele programmeurs en websitebouwers. Een vraag stellen en dan het beste antwoord knippen en plakken in je eigen project bespaart tijd en is een moderne manier van leren. Open source gaat over code uitwisselen.

Pythagoras versie 3

In versie 3 maken we de functie korteZijde wat slimmer. Indien de gebruiker per ongeluk de korte zijde en de lange zijde verwisselt, mag het programma niet fout gaan. Bovendien zetten we wat uitleg in het programma.
Python doet niets met alles na een #. Zo'n regel met # is alleen om het programma voor mensen leesbaar te maken.

De oplossing voor de fout van versie 2 is twee vertakkingen binnen korteZijde. In het eerste geval is b inderdaad de korte zijde en c de lange zijde. Dan kunnen we gewoon de wortel trekken uit het kwadraat van de lange zijde min het kwadraat van de korte zijde. Anders moeten we eerst b en c verwisselen.
Het eerste geval staat achter de dubbele punt na if en het tweede geval staat achter de dubbele punt na else. Ook hier geldt volgens de Python-syntax dat alles na de dubbele punt met vier spaties inspringen hoort bij respectievelijk if of bij else. Merk op dat korteZijde nu twee niveau's heeft van code die bijelkaar hoort. Het eerste niveau is de code van korteZijde met vier spaties inspringen en het tweede niveau is de code van if en de code van else met acht spaties inspringen.

import math

# Stelling van Pythagoras: a^2 + b^2 = c^2
# a en b zijn korte zijdes
# c is de lange zijde

def langeZijde(a, b):
    return(math.sqrt(a**2 + b**2))

def korteZijde(b, c): 
    if c > b:
        return(math.sqrt(c**2 - b**2))
    else:
        return(math.sqrt(b**2 - c**2))     
    

Pythagoras versie 4

Versie 3 kan je nog kapot maken door de lange zijde even lang te maken als de korte zijde. Probeer het maar. De oplossing is nog een vertakking binnen de functie korteZijde, maar eigenlijk is dit geen echte oplossing. Daarom geeft versie 4 een foutboodschap.

Versie 4 laat zien hoe je binnen een functie drie verschillende vertakkingen kunt maken met if, elif en else. Eventueel kan je nog meer vertakkingen maken met elif, maar dat is hier niet nodig.

import math

# Stelling van Pythagoras: a^2 + b^2 = c^2
# a en b zijn korte zijdes
# c is de lange zijde

def langeZijde(a, b):
    return(math.sqrt(a**2 + b**2))

def korteZijde(b, c): 
    if c > b:
        return(math.sqrt(c**2 - b**2))
    elif b > c:
        return(math.sqrt(b**2 - c**2))
    else:
        print("Lange zijde is even lang als een korte zijde: " + str(b))
        print("Dit is geen driehoek!")
        return(0)     
    

Bij de foutboodschap zie je de functie str, die is noodzakelijk om een tekst tussen aanhalingstekens samen te voegen met een getal. Een tekst heet in Python string en je kunt stukjes tekst aan elkaar plakken met +, maar omdat een getal geen tekst is, moet je de functie str gebruiken om het getal om te zetten in een getal tussen aanhalingstekens.

Hieronder wordt gedemonstreerd wat het verschil is tussen en tekst en een getal in Python en waarom je de functie str moet gebruiken. Probeer het zelf even uit in de Python-shell.

abcFormule

Je bent nu een programmeur en je mag nu zelf de functie voor de abc-formule afmaken.
Een groot deel is al af. In het programma hieronder hoef je alleen maar iets te veranderen in de geel gemaakte regels.
De rest van de code hoef je (nog) niet te begrijpen.

Voor deze gelegenheid maak je meteen kennis met de techniek van extreme programming (XP). Bij XP schrijven de programmeurs eerst code om hun code te testen. Ze automatiseren dus het testen van hun code. Hier staat die test-code onder de stippellijn. Dankzij die test-code hoef je alleen op F5 te drukken en alleen maar iets te veranderen in de geel gemaakte regels. Je hoeft niet steeds allerlei testjes in te toetsen in de Python-shell.
Als deze 3 testjes goed werken, kan je nog meer opgaven opzoeken in je wiskundeboek (of op het internet) om jezelf te overtuigen dat jouw versie van abcFormule in alle gevallen altijd goed werkt.
Eigenlijk zou je de test-code helemaal kunnen verwijderen als je klaar bent met testen, maar XP-programmeurs doen dat niet. Ze laten de test-code in het programma voor het geval dat ze deze code ooit moeten aanpassen, want dan hebben ze meteen een aantal testgevallen. Ze zetten alleen een # voor testjes().

import math

# abc formule voor het oplossen van de vergelijking ax^2 + bx + c = 0

def abcFormule(a, b, c):
    print("Los op: "  + str(a) + "x^2 + " + str(b) + "x + " + str(c) + " = 0")
    d = 0
    if d < 0:
        print("Geen oplossingen")
        return([0])
    elif d == 0:
        x1 = 0
        print("Een oplossing: x = " + str(x1))
        return([1, x1])
    else:
        w  = 0
        x1 = 0
        x2 = 0
        print("Twee oplossingen: x = "+ str(x1) + " of x = " + str(x2))
        return([2, x1, x2])

#----------------------------------------------------------------------------

def testOplossing(a, b, c, x):
    if a*(x**2) + b*x + c == 0:
        return(True)
    else:
        print("x = " + str(x) + " is geen oplossing")
        return(False)

def test_abcFormule(a, b, c):
    resultaat = abcFormule(a, b, c)
    if resultaat[0] == 1:
        testOplossing(a, b, c, resultaat[1])
    elif resultaat[0] == 2:
        testOplossing(a, b, c, resultaat[1])
        testOplossing(a, b, c, resultaat[2])
        
# 3x^2 + 30x + 72 = 0 heeft 2 oplossingen voor x = -6 of x = -4
# x^2 - 2x + 1 = 0 heeft 1 oplossing voor x = 1
# 2x^2 - 9x + 11 = 0 heeft geen oplossingen    

def testjes():
    test_abcFormule(3, 30, 72)
    test_abcFormule(1, -2, 1)
    test_abcFormule(2, -9, 11)

testjes()
    

Samenvatting

Dit is wat je nu moet kunnen en kennen. Als dat inderdaad het geval is, ben je geslaagd als beginnend Python-programmeur!

Je kunt nu verder gaan met DRY programmeren met Python Turtle