Cursus programmeren in Python Navigatie 1. Hieronder kun je op een hoofdstuk klikken. Wanneer je aan het begin van een hoofdstuk bent kun je op de paragraaf klikken. Onder aan de pagina staat een link om terug te keren naar de inhoudsopgave. Inhoudsopgave Cursus 2. Aan het eind van deze cursus staat een klein naslagwerk om dingen snel op te zoeken. Onder iedere pagina staat een link ernaartoe. Inhoudsopgave naslagwerk 3. Verder kun je met <ctrl><F> een zoekscherm in de pdf openen om snel een zoekterm in te kunnen voeren die je naar de juist pagina brengt. Stappenplan fouten opsporen 2 Programmeertechnieken Als je de fout in je programma niet kunt vinden, klik dan op bovenstaande link. Inhoudsopgave Cursus 1 Inhoudsopgave naslagwerk Inhoudsopgave Cursus Les 1 1.1 Waarom Python 1.2 Werken met Python3.2 1.3 Pyscripter Portable 1.4 Zelf aan de slag 1.5 Rekenkundige operatoren 1.6 Commentaar 1.7 Regelnummers 1.8 Volgorde van bewerkingen 1.9 Printfunctie 1.10 Escapeteken \ 1.11 Opgaven Les 2 2.1 Variabelen 2.2 Variabelenamen 2.3 Integers, floats en strings 2.4 Invoer van gegevens 2.5 Plakteken 2.6 Strings omzetten naar integers en andersom 2.7 Functies nesten 2.8 Kommanotatie 2.9 De functie len() 2.10 Foutmeldingen oplossen 2.11 Opgaven Les 3 3.1 Vertakkingen 3.2 Waar of niet waar 3.3 Inspringingen 3.4 Vergelijkings operatoren 3.5 Logische operatoren 3.6 If elif else 3.7 if in if opdracht 3.8 Opgaven Les 4 4.1 Naslagwerken 4.2 Built in functies 4.3 Printfunctie 4.4 Modules importeren 4.5 Module random 4.6 Tekenen 4.7 Opgaven Les 5 5.1 Lijsten 5.2 Index 5.3 Toevoegen, verwijderen en samenvoegen 5.4 Lijst in een lijst 5.5 Snel vullen, index uitlezen en lengte van de lijst bepalen 5.6 In en not in 5.7 For lus 5.8 range(start,stop,stapgrootte) 5.9 Gebruik van de index in een lus 5.10 Opgaven Les 6 6.1 Tekenen met een for-lus 6.4 Lus in een lus 6.5 Opgaven 6.2 While lus en declareren 6.3 Eeuwige lus Les 7 7.1 Algoritme 7.2 PSD 7.3 Structorizer 7.4 Teller, break, continue, exit Enumerate zorgt voor teller in for lus 7.6 Opgaven 7.5 Les 8 8.1 Tuples 8.2 Dictionaries 8.3 Lezen van en schrijven in bestanden met de with opdracht 8.4 Lezen van en schrijven in dictionairies 8.5 Opgaven Les 9 9.1 Modulair werken met zelfgemaakte functies database maken 9.4 Scope 9.5 Opgaven Les 10 10.1 Error Handling 10.2 Opgaven blok 1 10.5 Breakpoints 10.6 Opgaven blok 2 9.2 Telefoonlijst 10.3 Debugging 9.3 Een 10.4 Stepping Les 11 11.1 Object georiënteerd programmeren Encapsulation 11.2 Class Instance Object Attribute Value 11.3 Methoden Constructor self 11.4 Documentatie van de class 11.5 Opgaven Les 12 12.1 Overerving (Inheritance) 12.2 Maintainable software Inhoudsopgave Cursus 2 12.3 Opgaven Inhoudsopgave naslagwerk Les 1 1.1 Waarom Python 1.2 Werken met Python3.2 1.3 Pyscripter Portable 1.4 Zelf aan de slag 1.5 Rekenkundige operatoren 1.6 Commentaar 1.7 Regelnummers 1.8 Volgorde van bewerkingen 1.9 Printfunctie 1.10 Escapeteken \ 1.11 Opgaven 1.1 Waarom Python Er zijn heel veel programmeertalen. Vaak wordt de vraag gesteld: “welke taal kun je als beste leren?” Het meest gegeven antwoord is: “dat hangt ervan wat je ermee wilt doen. Iemand die websites bouwt is het meest gebaat bij PHP of Perl, iemand die games maakt zal eerder Java of C++ gaan leren en iemand die veel werkt met Microsoft Office pakketten zal meer hebben aan Visual Basic.” Een aantal docenten en professoren zegt echter “Begin met Python”. De redenen die zij aanvoeren zijn: Python is veel makkelijker aan te leren dan bijvoorbeeld PHP, Java of C++. Met Python kun je met minder code hetzelfde bereiken als in andere talen. Python is een moderne taal waarmee je prima object georiënteerd kunt programmeren. Python kent een eenvoudige portable editor die vanaf usb-stick draait. Python is open source en daardoor helemaal gratis. Over de hele wereld werken vrijwilligers aan de ontwikkeling van deze taal maar ook bedrijven als Google dragen hun steentje bij. Wanneer je eenmaal programmeren hebt geleerd in Python is de overstap naar een andere taal vrij gemakkelijk. Alle programmeertalen lijken namelijk op elkaar. Dat het eenvoudige taal is wil niet zeggen dat je er geen ingewikkelde dingen mee kunt programmeren. 1.2 Werken met Python3.2 Python is een programmameertaal die nog steeds verder ontwikkeld wordt. Wij werken met versie 3.2. Er zijn verschillende manieren om met python te werken: PyscripterPortable. Dit heeft de voorkeur. Deze portable python bewerker (editor) werkt zelfs op je usb-stick dus je kunt er ook thuis mee werken. PyscripterPortable is een windows programma. Mac gebruikers zullen thuis een andere editor/compiler voor Python moeten installeren. Op school is het te bereiken via het menu. Online editor. Daar zijn er verschillende van. Tot nu toe bieden ze echter minder functionaliteit als offline programma’s. 1.3 Pyscripter Portable Een portable programma is een programma dat je niet hoeft te installeren. Je kopieert het gewoon naar je stick. Klik hiervoor op “Deze computer, lesmateriaal(Y), Informatica, Portable Tools”. Kopieer nu de map “python_portable_3211” naar je stick. Inhoudsopgave Cursus 3 Inhoudsopgave naslagwerk Thuis kun je de map weer naar computer kopiëren. Maak daar een snelkoppeling naar je bureaublad van PyScripter-Portable.exe . Wanneer je deze map thuis op je stick of je computer opent klik je op PyScripterPortable.exe. Dit is een handige editor voor python. Op school zoek je het programma in het menu op. Je krijgt nu een scherm te zien dat er uitziet als hieronder: De editor is verdeeld in drie gedeeltes. Het gedeelte linksboven dient voor navigatie en gebruik je het minst. In het gedeelte rechtsboven typ je de code en op de onderbalk komt het resultaat; de output van je programmeercode of een eventuele foutmelding. Zorg dat de onderste balk op tabblad “Python interpreter” staat. Usb-stick vergeten Wanneer je geen usb-stick bij je hebt, sla je de bestanden op onder "Mijn documenten" in een map "python". Je stuurt de bestanden als bijlage van een mail aan jezelf zodat je thuis verder kunt werken. Mac-gebruikers Op een Mac is python 2.7 standaard geinstalleerd. Je hebt echter versie 3 nodig. Het volgende wat je nodig hebt is een "editor en compiler". Hierin kun je de code schrijven en op fouten laten controleren. Op de volgende site staat uitgelegd wat je alle maal moet Inhoudsopgave Cursus 4 Inhoudsopgave naslagwerk doen. http://blog.manbolo.com/2013/02/04/how-to-install-python-3-and-pydev-on-osx#4 Dan zit je alleen nog met het probleem van het overbrengen van code tussen thuis (mac) en school (windows). Wat je zou kunnen doen is je code in een e-mail naar jezelf plakken. Die email haal je dan op de andere locatie op. Je moet dan nog wel de tab-stops aanpassen. Een andere mogelijkheid is om met een online editor te werken. 1.4 Zelf aan de slag Wis in het scherm rechtsboven de onderste vier regels. Later leggen we wel uit wat je hiermee kunt doen. In het bovenste gedeelte schrijf je achter “name”: “Les 1” en achter “Author” “je eigen naam”. Verder blijft alles hetzelfde. Kies in het menu file, save en sla het bestand op als “les_1.py” in een nieuwe map “python” op je stick. De extensie “py” wordt er vanzelf al achter gezet dus die hoef je niet te typen. Dit doe je aan het begin van iedere nieuwe les. Typ nu in het gedeelte rechtsboven onder de groene letters: print(2 + 3) Klik in het menu op run,run of toets <CTRL><F9> of klik op het groene pijltje in het menu. Het programma wordt nu uitgevoerd en in de onderbalk verschijnt het getal 5. Het programma heeft drie dingen gedaan: het heeft de getallen 2 en 3 opgeteld, de uitkomst naar het scherm geschreven en is naar de volgende regel gesprongen. Dit laatste zie je aan de drie vishaken onder de “5”. 1.5 Rekenkundige operatoren De plus in de vorige opdracht heet een “rekenkundige operator”. Er zijn nog meer rekenkundige operatoren in Python 3. Hier volgt een overzicht. + voor optellen – voor aftrekken * voor vermenigvuldigen / voor delen ** voor machtsverheffen bijvoorbeeld 2**3 = 2*2*2 = 8 % voor modulus of modulo; dit is de rest van een deling. Bijvoorbeeld 7%3 geeft 1 want 7 gedeeld door 3 is 2 met rest 1. Typ nu onder “print(2+3)” het volgende: print(2**4) Run het programma met <CTRL><F9>. Als het goed is verschijnt onderaan eerst de uitkomst van de eerste regel: 5 en daarna de uitkomst van de tweede regel: 16. 1.6 Commentaar Wanneer je programmeert is het belangrijk dat je er voldoende commentaar tussenzet. Dan kun jij of een ander later beter zien waar de code over gaat. Commentaarregels Inhoudsopgave Cursus 5 Inhoudsopgave naslagwerk worden niet uitgevoerd. In python gebruiken we hiervoor het hekje #. Ze worden ook gebruikt om code tijdelijk uit schakelen bij het testen. Typ boven de eerste regel het volgende: # Voorbeelden les 1 Run het programma met <CTRL><F9>. Je krijgt hetzelfde als de vorige keer want commentaarregels worden niet uitgevoerd. Wanneer je het programma runt worden alle regels achtereenvolgens uitgevoerd. Wanneer je wilt dat bijvoorbeeld alleen de laatste regel wordt uitgevoerd maak je van de tweede regel een commentaarregel. Hiervoor zit in “portable python” een speciale knop in het menu. Selecteer de tweede regel en klik op de knop: Run het programma met <CTRL><F9>. Als het goed is verschijnt nu alleen “16”. Door de tweede regel opnieuw te selecteren en op de ## knop te drukken kun je de regel weer actief maken. Dit is handig bij het testen van je code. Probeer het uit en run het programma. 1.7 Regelnummers Wat ook handig is zijn regelnummers. Wanneer je een foutje maakt, verschijnt er een foutmelding met daarin het regelnummer van de regel waarin de fout zit. Klik op de knop van regelnummers: Vul de bovenste commentaarregels in zoals hieronder: Inhoudsopgave Cursus 6 Inhoudsopgave naslagwerk 1.8 Volgorde van bewerkingen De rekenvolgorde zoals je die bij het vak rekenen hebt gehad geldt hier ook: Haakjes gaan voor alles. ** *, /, % +, – Typ als vierde regel van je programma: print(2+3*4) Schakel de tweede en de derde regel van je programma uit me ##. Run het programma met <CTRL><F9>. Als het goed is, is de uitkomst “14”. Eerst wordt de vermenigvuldiging uitgevoerd daarna pas de optelling. Wil je toch dat 2 en 4 eerst worden opgeteld, dan zul je haakjes moeten gebruiken. Typ als vijfde regel van je programma: print((2+3)*4) Run het programma met <CTRL><F9>. Als het goed is komt er nu “20” uit. Dat is wat anders dan in de vorige opdracht. nu wordt ere vanwege de haakjes eerst opgeteld en daarna pas vermenigvuldigd. Opslaan Klik linksboven op de diskette om het programma op te slaan. Sla het op je usbstick op in een map die “python” heet. Noem het bestand “les_1”. Sla iedere nieuwe les in een nieuw bestand op. Wanneer je het bestand eenmaal een naam gegeven hebt en één keer hebt opgeslagen dan dan hoef je jezelf geen zorgen meer te maken over opslaan. Iedere keer als je het bestand runt wordt het automatisch opgeslagen. 1.9 Printfunctie De printfunctie heeft nog meer mogelijkheden. Je kunt ook tekst en allerlei tekens op het scherm zetten. Typ: print(“Dit is mijn eerste zin.”) en test uit of het werkt. Let op de dubbele aanhalingstekens. Gebruik hiervoor de <SHIFT> toets. Wanneer je de zin kopieert in plaats van typt zul je merken dat je een foutmelding krijgt. Dit komt omdat de aanhalingstekens niet goed doorkomen. Die zul je Inhoudsopgave Cursus 7 Inhoudsopgave naslagwerk opnieuw moeten typen. Met behulp van komma’s kun je tekst en getallen afwisselen. Let op de dubbele aanhalingstekens. Typ: print("Hij bestelde",3*4,"krentenbollen.") Als het goed is komt er : Hij bestelde 12 krentenbollen. Typ nu: print("Hij bestelde",”3*4”,"krentenbollen.") Als het goed is komt er : Hij bestelde 3*4 krentenbollen. Onthoud dat om getallen waar je mee rekent geen aanhalingstekens komen en als het letterlijk moet worden weergegeven wel. 1.10 Escapeteken \ Soms staan er tekens in een zin die je niet zonder meer letterlijk kunt typen. Dit zijn bijvoorbeeld de dubbele aanhalingstekens zelf. Typ: print("Hij zei: "Wat een onzin".") Als het goed is krijg je nu een foutmelding. Verbeter de code tot: print("Hij zei: \"Wat een onzin\".") Merk op dat door de schuine strepen (backslash) de dubbele aanhalingstekens wel geprint worden. De backslash zorgt ervoor dat ze letterlijk geprint worden en ziet ze niet meer als onderdeel van de code maar als een stukje tekst. De backslash wordt ook wel het escape teken genoemd. Hij wordt onder andere gebruikt om code van hackers onschadelijk te maken. In andere programmeertalen kan het ook een ander teken zijn dan de backslash. Sla een regel over. Typ de volgende regel: # Opgaven les 1. Maak nu in hetzelfde bestand de volgende opgaven. Vergeet niet om je bestand op te slaan als je stopt. Schrijf boven iedere regel een commentaarregel met het nummer van de opgave dus bijvoorbeeld zo: # 1.1 1.11 Opgaven 1.1. Maak een programmaregel die 5 tot de macht 4 uitrekent. Als het goed is komt er Inhoudsopgave Cursus 8 Inhoudsopgave naslagwerk 1.2. 1.3. 1.4. 1.5. 1.6. 1.7. 625 uit. Maak een programmaregel die 70 deelt door 3. Als het goed is komt er 23.333333 uit. Maak een programmaregel die de rest van 658 gedeeld door 15 uitrekent. Als het goed is komt er 13 uit. Maak een programmaregel die de volgende berekening uitvoert (4+2)*6-(8-2)/(4-1). Als het goed is komt er 34.0 uit. Als dat niet het geval is controleer dan je haakjes. Er moeten evenveel linker als rechter haakjes zijn. Maak een programmaregel die de volgende zin op het scherm zet: Ik begin net met programmeren. Iemand heeft twee keer vijf km gefietst en drie keer twee km gelopen. Maak een programmaregel waarin deze berekeningen worden uitgevoerd en die de volgende zin op het scherm zet: Ik heb vandaag 10 km gefietst en 6 km gelopen. Maak een programmaregel die de volgende zin op het scherm zet: Het antwoord is “Ja/Nee”. Zorg dat de aanhalingstekens ook geprint worden! Maak een backup van je bestand en LAAT JE LES DOOR DE DOCENT AFTEKENEN. Inhoudsopgave Cursus 9 Inhoudsopgave naslagwerk Les 2 2.1 Variabelen 2.2 Variabelenamen 2.3 Integers, floats en strings 2.4 Invoer van gegevens 2.5 Plakteken 2.6 Strings omzetten naar integers en andersom 2.7 Functies nesten 2.8 Kommanotatie 2.9 De functie len() 2.10 Foutmeldingen oplossen 2.11 Opgaven Open Python Portable. Maak linksboven met een nieuw bestand aan. Wis de laatste vier regels. Sla het bestand op als “les_2” in de map “python” op je usb-stick. 2.1 Variabelen Een variabele kun je zien als een leeg doosje waar je iedere keer wat anders in kunt stoppen. Typ het volgende programmaatje: # Voorbeelden Les 2 # variabelen eersteGetal = 7 tweedeGetal = 8 print(eersteGetal + tweedeGetal) Run het programma. Als het goed is komt er 15 uit. Verander 7 in 2. Run het programma. Als het goed is komt er 10 uit. Je hebt 7 uit het doosje “eersteGetal” gehaald en er 2 in gestopt. 2.2 Variabelenamen Het is een goede gewoonte om variabelenamen te laten beginnen met een kleine letter en ieder heel woord in de variabele naam met een hoofdletter te laten beginnen. Bijvoorbeeld: eenZeerLangeVariabeleNaam 2.3 Integers, floats en strings Integers zijn gehele getallen. Floats zijn getallen met een zwevende punt. Ze worden ook wel “real” of “double” genoemd. Je schrijft ze met een punt dus bijvoorbeeld 25.3 Een string is een tekenreeks. Voorbeelden zijn koekje, jan@gmail.com, op67wr#. Met een string kun je niet rekenen. Om een string moet je altijd aanhalingsteken zetten. Dit zijn slechts de drie eenvoudigste datatypen (gegevenssoorten). Er zijn er nog meer. Inhoudsopgave Cursus 10 Inhoudsopgave naslagwerk ➢ Maak het voorgaande programmaatje inactief met de ## knop. Sla een regel over en typ het volgende programma. Let op dat als je code kopieert van pdf naar de editor, je de dubbele aanhalingstekens opnieuw moet typen. # floats x = 3.2 y = 4.1 print(x+y) Run daarna het programma. Als het goed is komt er 7.3 uit. ➢ Probeer dit ook eens: # foute notatie voor floats a = 2,3 b = 3,1 print(a+b) Nu komt er heel wat anders uit namelijk (2,3,3,1) De komma notatie wordt gebruikt voor een ander datatype: de “lijst”. ➢ Maak het voorgaande programmaatje inactief met de ## knop. Sla een regel over en typ het volgende programma: # string, gebruik aanhalingstekens huisNummer = "twee" print(huisNummer) print("huisNummer") ➢ Run het programma. Hieronder staat wat er uit zou moeten komen: twee huisNummer De aanhalingstekens binnen de print opdracht zorgen ervoor dat de tekst letterlijk wordt geprint. 2.4 Invoer van gegevens Tot nu toe moest je alles van te voren in het programma stoppen. Je kunt het programma echter ook om gegevens laten vragen. Dit gebeurt met de functie “input”. Op internet kom je nog vaak de functie raw_input() tegen maar die komt uit python 2 en wordt in python 3 niet meer gebruikt. ➢ Maak de voorgaande programmaregels inactief, sla een regel over en typ het volgende: # Strings invoeren je_naam = input("Noem je naam: ") print("Jij heet " + je_naam + ".") In dit programma wordt datgene wat ingevoerd wordt via het invoerscherm opgeslagen in de variabele (het lege doosje) je_naam . Vervolgens wordt in de print functie de inhoud van het doosje je_naam op het scherm gezet. ➢ Run het programma. Als het goed is komt er eerst een invulschermpje tevoorschijn: Inhoudsopgave Cursus 11 Inhoudsopgave naslagwerk ➢ Klik met je muis in het witte gedeelte en typ bijvoorbeeld Piet . Klik daarna op OK. Als het goed is komt nu het zinnetje “Jij heet Piet. ” op het scherm te staan. De letterlijke tekst wordt binnen de print functie door dubbele aanhalingstekens omgeven. Merk op dat achter het woordje “heet” en extra spatie staat. Om variabelen staan geen aanhalingstekens. De stukjes worden aan elkaar geplakt met het plus teken. 2.5 Plakteken Onthoud: Het plus teken + is het plakteken. Hiermee kun je strings en variabelen aan elkaar plakken. 2.6 Strings omzetten naar integers en andersom De functie input kan alleen maar strings inlezen. Dat is lastig als je getallen wilt inlezen die je daarna in een berekening wilt gebruiken. De functie int() zorgt voor de omzetting van string naar integer. Andersom zorgt de functie str() voor de omzetting van integers naar strings. Dit heb je bijvoorbeeld nodig om bij de printfunctie integer variabelen en strings aan elkaar te plakken. ➢ Maak de voorgaande programmaregels inactief, sla een regel over en typ het volgende: # Strings omzetten naar integers en andersom a = int(input("Noem het eerste getal: ")) b = int(input("Noem het tweede getal: ")) c=a+b print("Wanneer je " + str(a) + " en " + str(b) + " optelt krijg je " + str(c) + ".") ➢ Run het programma. Als het goed is komt er “Wanneer je 20 en 30 optelt krijg je 50.” op het scherm te staan als je de getallen 20 en 30 hebt ingevoerd. 2.7 Functies nesten a = int(input("Noem het eerste getal: ")) In bovenstaand voorbeeld zie je dat de functie input() in de functie int() genest zit. Eerst wordt de binnenste functie uitgevoerd, daarna pas de buitenste. In dit geval wordt er eerst input opgehaald en daarna wordt van de string die ingevoerd is pas een integer gemaakt. Let goed op de haakjes. Er moeten altijd evenveel haakjes naar links zijn, als naar rechts. 2.8 Kommanotatie Voorgaande code voor de printfunctie kan een stuk korter door gebruik te maken van de komma notatie. Inhoudsopgave Cursus 12 Inhoudsopgave naslagwerk ➢ Maak de voorgaande programmaregels inactief, sla een regel over en typ het volgende: # Komma notatie a = int(input("Noem het eerste getal: ")) b = int(input("Noem het tweede getal: ")) c = a+b print("Wanneer je",a,"en",b,"optelt krijg je",c,".") ➢ Run het programma. Als het goed is komt er weer “Wanneer je 20 en 30 optelt krijg je 50.” op het scherm te staan als je de getallen 20 en 30 hebt ingevoerd. Merk op dat de komma’s ook meteen voor een spatie zorgen. 2.9 De functie len() De functie len() telt hoeveel tekens er in een string zitten. ➢ Maak de voorgaande programmaregels inactief, sla een regel over en typ het volgende: # De functie len() mijnNaam = input("Noem je naam:") lengte = len(mijnNaam) print(4*(mijnNaam + lengte*" ")) ➢ Run het programma. Als het goed is komt er “Harm Harm Harm Harm “ te staan als Harm de ingevoerde naam is. Omdat Harm vier letters heeft worden er vier spaties achter gezet. Dit wordt vier keer afgedrukt. Merk op dat de operator * dus ook toepasbaar is op strings. 2.10 Foutmeldingen oplossen Mogelijk heb je bij de voorbeelden alt foutmeldingen gekregen door tikfouten op kopieer en plakfouten. 1. In de foutmelding staat altijd het regelnummer. Meestal bevindt de fout zich in de regel zelf of de regel erboven. 2. Wanneer in de foutmelding Engelse woorden voorkomen die je niet kent haal je die door de vertaalmachine. 3. Wanneer in de foutmelding iets van string of integer voorkomt is het meestal een notatiefout. 4. Wanneer in de foutmelding “indent” voorkomt dan heeft het met inspringende code te maken. Python dwingt je alles netjes te noteren. 5. Bij kopiëren en plakken kunnen de aanhalingstekens soms niet goed doorkomen. Sla een regel over. Inhoudsopgave Cursus 13 Inhoudsopgave naslagwerk Typ in de volgende regel: # Opgaven les 2. Maak nu in hetzelfde bestand de volgende opgaven. Vergeet niet om je bestand op te slaan als je stopt. Schrijf boven iedere regel een commentaarregel met het nummer van de opgave dus bijvoorbeeld zo: # 2.1 2.11 Opgaven 2.1. 2.2. 2.3. 2.4. 2.5. Schrijf een programma dat de gebruiker zijn of haar naam laat invoeren. Vervolgens moet de naam uitgeprint worden in een zin.”Als er “Pietje”wordt ingevoerd moet er: Mijn naam is Pietje. komen te staan. Let op de punt aan het einde van de zin. Schrijf een programma van vier regels dat om twee getallen vraagt, eerst om het ene en daarna om het andere. De getallen moeten vermenigvuldigd worden. De uitkomst van de vermenigvuldiging moet geprint worden in het zinnetje: Wanneer je .. en .. vermenigvuldigd komt er .. uit. Op de plaats van de puntjes komen dan de ingevoerde getallen en de uitkomst. Hou invoer, berekening en uitvoer gescheiden. Schrijf een programma van drie regels dat naar een getal vraagt. Het programma telt 3 bij dat getal op. Daarna vermenigvuldigt het programma het resultaat met 2, trekt er 4 vanaf, trekt er twee keer het oorspronkelijke getal vanaf, voegt 3 toe en print het zinnetje: “De uitkomst is ...” met op de plaats van de puntjes de verrassende uitkomst van de som. Hou invoer, berekening en uitvoer gescheiden. Voer het programma een paar keer uit. Test of er altijd 5 uitkomt. Schrijf een programma van twee regels dat om een dier vraagt. Vervolgens moet dit woord 2000 keer geprint worden steeds gescheiden door een spatie. Tip: bekijk het laatste voorbeeld. Schrijf een programma dat de gebruiker vraagt naar zijn of haar favoriete kleur. Zorg dat de volgende output op het scherm verschijnt als de kleur rood wordt gebruikt. Tussen de woorden bevindt zich slechts één spatie. Gebruik vier printregels.Tip: bekijk het laatste voorbeeld nog eens. Sla je bestand op. Maak een backup van je bestand. LAAT JE LES DOOR DE DOCENT AFTEKENEN. Inhoudsopgave Cursus 14 Inhoudsopgave naslagwerk Les 3 3.1 Vertakkingen 3.2 Waar of niet waar 3.3 Inspringingen 3.4 Vergelijkings operatoren 3.5 Logische operatoren 3.6 If elif else 3.7 if in if opdracht 3.8 Opgaven Open Python Portable. Maak linksboven met een nieuw bestand aan. Wis de laatste vier regels. Sla het bestand op als “les_3” in de map “python” op je usb-stick. 3.1 Vertakkingen Het gebeurt in een computerprogramma nog wel eens dat afhankelijk van de ingevoerde gegevens of de uitkomst van een vorige berekening, dat het programma verschillende dingen kan doen. Het programma vertakt zich dan als het ware. 3.2 Waar of niet waar Het volgende programma vraagt de gebruiker om zijn voornaam. Typ en run: # Voorbeelden les 3 # Vertakkingen voornaam = input("Noem je voornaam: ") if voornaam: print("Dank je wel.") else: print("Je bent vergeten om iets in te vullen.") De regel “if voornaam” betekent: “Bestaat de variabele voornaam.” Als er iets ingevuld is dan is het antwoord op deze vraag “Ja”. De bewering is dan waar (engels: true). Is er niets ingevuld dan is het antwoord op deze vraag “Nee” en is de bewering niet waar (engels: false). Het “else” gedeelte mag je weglaten als er niets hoeft te gebeuren als niet aan de voorwaarde is voldaan. Let op de dubbele punt achter if en else. 3.3 Inspringingen Let op!!! De inspringingen (indentation) zijn in Python verplicht. Python dwingt je als het ware tot het netjes opschrijven van code. Als in de foutmelding het woordje “indent” (= inspringing) voorkomt dan weet je dat hiermee iets is fout gegaan. 3.4 Vergelijkings operatoren Operator voorbeeld Inhoudsopgave Cursus Omschrijving 15 Inhoudsopgave naslagwerk A == B A != B A>B A<B A >= B A <= B Waar als A gelijk is aan B Waar als A niet gelijk is aan B. Waar als A groter is dan B Waar als A kleiner is dan B. Waar als A groter of gelijk aan B is. Waar als A kleiner of gelijk aan B is. Verschil python 2 en 3: in python 2 mocht je in plaats van != ook <> gebruiken. In python 3 mag dit niet meer. In if elif else opdrachten worden vaak logische operatoren gebruikt. Deze kijken of een bewering waar of niet waar is. Let op dat als twee dingen aan elkaar gelijk moeten zijn het dubbele == teken wordt gebruikt. 3.5 Logische operatoren Deze worden ook wel booleaanse operatoren genoemd. Operator Omschrijving Effect Voorbeeld A and B en Waar als A en B beiden waar zijn. Niet waar in alle andere gevallen. A or B of Waar als of A of B of beiden waar zijn. Niet waar als A en B beiden niet waar zijn. not B Ontkenning Waar als B niet waar is. Het volgende programma controleert of twee wachtwoorden aan elkaar gelijk zijn: Typ, run en probeer alle mogelijkheden uit: # wachtwoorden wachtwoord1 = input("Voer een wachtwoord in:") wachtwoord2 = input("Voer het wachtwoord nogmaals in:") if wachtwoord1 == wachtwoord2: print("De wachtwoorden zijn aan elkaar gelijk.") else: print("De wachtwoorden zijn niet aan elkaar gelijk") Het volgende programma print een boodschap uit als beide ingevoerde getallen groter dan 5 zijn. Als dat niet het geval is, gebeurt er niets. Typ, run en probeer alle mogelijkheden uit: # aan beide voorwaarden is voldaan a = int(input("Noem een getal onder de 10:")) b = int(input("Noem een ander getal onder de 10:")) if a > 5 and b > 5: print("Beide getallen zijn groter dan 5.") Het volgende programma print een boodschap uit als één of meer ingevoerde getallen groter dan 5 zijn. Verder wordt de optelsom van beide getallen geprint. Als dat niet het Inhoudsopgave Cursus 16 Inhoudsopgave naslagwerk geval is, gebeurt er niets. Typ, run en probeer alle mogelijkheden uit. De tabs zul je opnieuw in moet stellen. # aan één van de voorwaarden is voldaan a = int(input("Noem een getal onder de 10:")) b = int(input("Noem een ander getal onder de 10:")) if a > 5 or b > 5: c = a+b print("Eén of meer getallen zijn groter dan 5.") print(c) #not operator voornaam = input("Noem je voornaam: ") if not voornaam: print("Je bent vergeten om iets in te vullen.") else: print("Dank je wel.") 3.6 If elif else Het komt vaak voor dat er meer dan twee mogelijkheden zijn. Dan breid je de if else opdracht uit tot if elif else. Er mogen zoveel elif regels tussen staan als je maar wilt. In het volgende programma zijn er vier categorieën van getallen. Merk verder op dat in de ifopdracht er meer dan één logische operator wordt gebruikt. elif en else mogen ook weggelaten worden als er geen opdracht hoeft te worden uitgevoerd. Typ en run: # Prijzen prijs = int(input("Kies een geheel getal onder de tien voor je prijs:")) if prijs == 1 or prijs == 4 or prijs == 9: print("Je hebt een cadeaubon gewonnen.") elif prijs == 2: print("Je hebt een reis naar Ameland gewonnen.") elif prijs == 7: print("Je hebt een auto gewonnen.") else: print("Je hebt helaas geen prijs.") 3.7 if in if opdracht Het is ook mogelijk om binnen een if opdracht een andere if opdracht te nesten. Op dat moment worden de inspringen erg belangrijk zodat je weet wat bij wat hoort. In onderstaand voorbeeld wordt aan mensen die “Piet” heten en ouder dan twaalf jaar zijn een extra vraag gesteld. Typ, run en probeer alle mogelijkheden uit. Wanneer je kopieert en plakt moet je de aanhalingstekens en de inspringingen opnieuw doen. Inhoudsopgave Cursus 17 Inhoudsopgave naslagwerk # If in een if opdracht voornaam = input("Wat is je voornaam:") if voornaam == "Piet": leeftijd = int(input("Wat is je leeftijd:")) if leeftijd > 12: achternaam = input("Wat is je achternaam:") print("Jij heet", voornaam, achternaam,"en je bent",leeftijd,"jaar.") else: print("Je hebt niet de leeftijd die we zoeken.") else: print("Je bent niet degene die we zoeken.") Testen Als de code lijkt te werken moet je allerlei invoergegevens uitproberen om te kijken of iedere vertakking van het programma werd. Goed testen is net zo belangrijk als goed coderen. Sla het bestand op. Sla een regel over. Typ in de volgende regel: # Opgaven les 3. Maak nu in hetzelfde bestand de volgende opgaven. Vergeet niet om je bestand op te slaan als je stopt. Schrijf boven iedere regel een commentaarregel met het nummer van de opgave dus bijvoorbeeld zo: # 3.1 3.8 Opgaven 3.1 Hou je van Python? Maak een programma dat vraagt “Hou je van Python?”. Als het antwoord “Ja” is moet er “Dat is goed nieuws.” op het scherm komen. Als het antwoord “Nee” is moet er “Dat is slecht nieuws.” op het scherm komen. In alle andere gevallen moet er “Dat is geen antwoord op mijn vraag.” op het scherm komen. 3.2 Not code Schrijf een programma dat de gebruiker vraagt om een code te noemen. Als er geen code wordt ingevuld moet het antwoord: “ Je hebt niets ingevuld.“ geprint worden. Gebruik hiervoor verplicht de not operator. Als er wel een code is ingevoerd moet er “ Je code was: ...” worden geprint met op de plaats van de puntjes de code. 3.3 Beide kleuren Schrijf een programma dat twee keer om een kleur vraagt. Alleen als er de eerste keer rood geantwoord wordt en de tweede keer blauw komt er een mededeling “Dat zijn de juiste kleuren.” In alle andere gevallen moet de mededeling komen: “Dat zijn niet de juiste kleuren.” 3.4 Even of oneven Inhoudsopgave Cursus 18 Inhoudsopgave naslagwerk Schrijf een programma waarbij de gebruiker een getal moet invoeren. Het programma moet vervolgens bepalen of het getal even of oneven is en daarvan melding maken. Tip: Gebruik de modulus operator (zie les_1). Bedenk wat de rest is als je een even of een oneven getal deelt door twee. 3.5 Zwart of wit Schrijf een programma dat de gebruiker vraagt om een kleur. Wanneer de kleur “zwart” of “wit” is moet de melding komen “De kleur was zwart of wit.” Wanneer het een andere kleur is die begint met een letter na “d” in het alfabet moet de melding komen: “De kleur begint met een letter na “d” in het alfabet.” In de andere gevallen hoeft er niets te gebeuren. Gebruik logische operatoren. Let op dat de aanhalingstekens om “d” letterlijk weergegeven moeten worden. Tip: de groter dan operator werkt ook voor letters. 3.6 Geschikt of ongeschikt Schrijf een programma dat test of iemand geschikt is voor de Landmacht. De eerste vraag die de gebruiker moet beantwoorden luidt: “Wat is je leeftijd? Alleen als je minstens 17 jaar bent krijg je vraag twee anders krijg je de melding: “Je bent ongeschikt”. Vraag twee luidt: “Wat is je lengte in cm?” Alleen als je minimaal 155 cm bent krijg je de derde vraag anders krijg je de melding “Je bent ongeschikt”. Vraag 3 luidt “Heb je de Nederlandse nationaliteit?” Als het antwoord “Ja” of “ja” is krijg je de melding “Je bent geschikt”. Bij ieder ander antwoord krijg je de melding “Je bent ongeschikt.” Test alle mogelijkheden. Sla je bestand op. Maak een backup van je bestand. LAAT JE LES DOOR DE DOCENT AFTEKENEN. Inhoudsopgave Cursus 19 Inhoudsopgave naslagwerk Les 4 4.1 Naslagwerken 4.2 Built in functies 4.3 Printfunctie 4.4 Modules importeren 4.5 Module random 4.6 Tekenen 4.7 Opgaven Open Python Portable. Maak linksboven met een nieuw bestand aan. Wis de laatste vier regels. Sla het bestand op als “les_4” in de map “python” op je usb-stick. Python 3 kent een groot aantal ingebouwde functies. Dat aantal kun je nog uitbreiden door bepaalde bibliotheken te importeren. In deze les leer je vooral hoe je dingen zelf kunt opzoeken. 4.1 Naslagwerken De officiële documentatie voor Python 3 staat op: https://docs.python.org/3.2/ ➔ Wanneer je hier op "Library Reference" klikt en kun je bij alle built in functies komen. ➔ Via Global Module Index kun je bij een heleboel modules komen. ➔ Dezelfde documentatie is te bereiken via het menu “Help”, “Python manuals”. 4.2 Built in functies Je zoekt bijvoorbeeld een functie over afronden. Hier volgt een stappenplan: ➢ De functienamen zijn Engelstalig dus je moet eerst het Engelse woord vinden. Je vult het woord "afronden" in bij een vertaalsite. Dan vindt je het Engelse woord ervoor namelijk “round”. ➢ Typ in bij de zoekmachine “python3 round”. ➢ Meestal komen de volgende twee sites bovendrijven: https://docs.python.org/3.3/library/functions.html Dit is de officiële documentatie van Python waarin precies uitgelegd wordt wat de functie inhoud en wat hij doet. Klik op round(). Je vindt: round(number[, ndigits]) Return the floating point value number rounded to ndigits digits after the decimal point. If ndigits is omitted, it defaults to zero. Uitleg in het Nederlands: number kan hier een getal zijn of een variabele die een getal bevat. Het gedeelte tussen de rechte haken is niet verplicht maar als je het wel gebruikt is dit het aantal cijfers achter de komma. Als je het weglaat rond hij af op nul decimalen. http://www.tutorialspoint.com/python/number_round.htm Even naar beneden scrollen en je vindt wat voorbeeldcode over de functie round(). Wees erop bedacht dat deze voorbeelden in de Python 2 notatie staan. Een belangrijk verschil is de notatie van de printfunctie. In python 2 bevat deze geen haakjes, in Python 3 die wij gebruiken echter wel. In de documentatie Python 2 en Python 3 na het einde van deze cursus vindt je de belangrijkste verschillen. Inhoudsopgave Cursus 20 Inhoudsopgave naslagwerk Typ en run: # Voorbeeld 1 Afronden getal = float(input("Voer een getal in met vijf cijfers achter de punt:")) afgerond = round(getal,1) # Rond af op 1 cijfer achter de punt. print(getal, afgerond) 4.3 Printfunctie Een belangrijke functie is de functie print() . In de documentatie vind je: print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) Deze functie kan dingen wegschrijven. Binnen de haakjes vind je een aantal parameters: objects, sep, end, file en flush. *objects Door haakjes gescheiden kunnen dit meerdere variabelen, strings, integers, en andere gegevenstypen zijn. Voorbeeld: a=3 print(a,"voet",24) geeft: 3 voet 24 sep komt van separator = scheidingsteken; dit is standaard de spatie. Voorbeeld: print(2,3,4,sep='|') geeft 2|3|4 end is wat er na de opdracht moet gebeuren. Standaard staat deze op \n wat nieuwe regel betekent. file is het bestand waar hij naar schrijft. Dit is standdaard “sys.stdout”; alles wat hierin komt gaat naar het scherm. Je kan echter ook naar bijvoorbeeld voorbeeld.txt schrijven. flush Wanneer je byte voor byte iets naar een bestand wegschrijft kost dat veel tijd. Dit gebeurd bij Flush=true. Om de performance te verbeteren worden de gegevens vaak in een tijdelijke buffer weggeschreven. Pas als er voldoende gegevens zijn wordt het in één keer als één groot blok weggeschreven naar het bestand. Dit verbetert de performance. Standaard wordt bij de print functie pas iets echt weggeschreven bij een nieuwe regel. Dit gebeurt bij Flush=false. Flush=true gebruik je eigenlijk alleen in situaties waarbij je zeker wilt zijn dat het weggeschreven is voordat je verder gaat. Normaal gesproken is dit niet nodig. 4.4 Modules importeren Naast de built in functies kent Python een heleboel modules van functies die je kunt importeren. Dit doe je met de opdracht import. Voorbeelden van modules zijn: NumPy en SciPy die vol zitten met wiskundige functies Pygame voor het maken van 2d-games in Python Pyglet voor 3d animatie en games random voor willekeurige getallen turtle voor tekenen De bovenste drie zijn niet meegeleverd met pyscripter portable maar zijn wel gratis van het internet te halen. De onderste twee wel. In paragraaf 4.1 staat hoe je functies kunt vinden in deze modules. Inhoudsopgave Cursus 21 Inhoudsopgave naslagwerk 4.5 Module random Random getallen Random getallen zijn willekeurig gegenereerde getallen. Python kent hier verschillende functies voor. De functies bevinden zich in de module “random”. Wil je een random functie kunnen gebruiken dan moet je eerst de module aanroepen. Dit doe je met “import”. Het volgende programma genereert gehele getallen van 20 tot en met 30. Typ en run het programma minimaal 5 keer. Je zult zien dat er steeds een willekeurig getal tussen 20 en 30 op het scherm komt. # Voorbeeld 2 Random getallen import random a = random.randint(20,30) print(a) Merk op dat je de naam van de module voor de naam van de functie moet plakken. 4.6 Tekenen Om in Pyscripter Portable te kunnen tekenen moeten we eerst een instelling aanpassen. Module Turtle 1. Ga in het menu naar "Run, Python Engine" en kies dan Remote(Tk). De standaard instellling is “Remote”. De module Turtle die we gaan gebruiken heeft echter “Remote(Tk)” nodig. Alle turtle opdrachten zijn te vinden op: https://docs.python.org/3.2/ Kies daarna voor Global Module Index en dan turtle. Je kunt ook in het menu klikken op Help, Python manuals, modules, turtle. Turtle betekent schildpad. We gaan nu een rechthoekje tekenen. In het programma is de schildpad een soort pijltje. 2. Typ en run: #Voorbeeld 3 Rechthoek import turtle #We mogen gebruik maken van de functies uit de turtle module venster = turtle.Screen() # maakt een grafisch venster jorah = turtle.Turtle() # maakt een schildpad genaamd jorah jorah.forward(100) # Er onstaat een lijntje van 100 pixels lang jorah.left(90) # jorah draait 90 graden naar links jorah.forward(50) jorah.left(90) jorah.forward(100) jorah.left(90) jorah.forward(50) jorah.left(90) venster.exitonclick() # Sluit het venster af als je er op klikt Inhoudsopgave Cursus 22 Inhoudsopgave naslagwerk 3. Maak alle voorgaande code inactief met ##. 4. Typ # Opgaven les 4 5. Typ #4.1 4.7 Opgaven 4.1 Grootste getal Maak een programma dat vier keer om een geheel getal vraagt. Vervolgens moet het programma het grootste getal bepalen. Gebruik hiervoor een slimme “built in” functie. Zoek deze zelf (zie 4.1) op want we hebben hem nog niet eerder gebruikt. Test je programma met diverse getallen. Probeer met name het rijtje 1,2,9,42. 4.2 Raden Schrijf een programma waarbij een random getal van 1 tot en met 3 gegenereerd wordt. Laat dit getal printen. Laat daarna de gebruiker een getal onder de 4 raden. Als het getal geraden wordt moet er “Goed geraden!” op het scherm komen. Als het fout is moet er “Fout” op het scherm komen te staan. Tip: zorg dat bij het testen het random getal geprint wordt. 4.3 Driehoek Teken met de module Turtle een rode driehoek met een blauwe rand. Hak het probleem in drie stukken: 1 Driehoek tekenen Tip kopieer de code uit het voorbeeld en vermaak deze. 2 Blauwe rand Tip Zoek in de module turtle naar een functie voor kleur. 3 Driehoek is gevuld met rode kleur. Tip Zoek in de module turtle op, hoe je dit moet doen. 4.4 Kies je richting Teken met de module een lijn. Daarna moet het programma vragen “Welke kant wil je op?”. Als de gebruiker “rechts” antwoordt moet er een lijn naar rechts worden getekend. Als de gebruiker “links” antwoordt moet er een lijn naar links worden getekend. Als de gebruiker iets anders antwoordt moet er een lijn rechtdoor worden getekend. Tekening bij antwoord “rechts”. Sla je bestand op. Maak een backup van je bestand. LAAT JE LES DOOR DE DOCENT AFTEKENEN. Inhoudsopgave Cursus 23 Inhoudsopgave naslagwerk Les 5 5.1 Lijsten 5.2 Index 5.3 Toevoegen, verwijderen en samenvoegen 5.4 Lijst in een lijst 5.5 Snel vullen, index uitlezen en lengte van de lijst bepalen 5.6 In en not in 5.7 For lus 5.8 range(start,stop,stapgrootte) 5.9 Gebruik van de index in een lus 5.10 Opgaven Open Python Portable. Maak linksboven met een nieuw bestand aan. Wis de laatste vier regels. Sla het bestand op als “les_5” in de map “python” op je usb-stick. Naast strings, integers en floats kent python nog een paar belangrijke datatypen. In deze les introduceren we “lijsten”. 5.1 Lijsten Een variabele is een leeg doosje waar je precies één ding in kunt doen. Een lijst kun je vergelijken met een leeg doosje met meer vakjes. Je definieert ze door rechte haken te gebruiken. Typ en run: # Voorbeeld 1 lijsten eenLegeLijst = [] eenAndereLijst = [1,2,3] print (eenAndereLijst) 5.2 Index De inhoud van de lijst kunnen we bereiken met behulp van een zogenaamde index. Deze geeft de positie in de lijst aan. Het eerste element van de lijst heeft index 0, het tweede 1 enzovoort. Typ en run: # Voorbeeld 2 index eenLijst = [5,66,"zon",'maan','ster'] print(eenLijst) # print de hele lijst print(eenLijst[0]) # print index 0, dat is 5 print(eenLijst[2]) # print index 2, dat is zon print(eenLijst[-1]) # bij een negatieve index wordt vanaf achteren geteld Wanneer je de inhoud van de lijst wilt veranderen gebruik je de index. Typ en run: # Voorbeeld 3 lijst aanpassen getalLijst = [14,16,18] print(getalLijst) Inhoudsopgave Cursus 24 Inhoudsopgave naslagwerk getalLijst[2] = 32 print(getalLijst) Als het goed is print hij als laatste regel: [14, 16, 32] 5.3 Toevoegen, verwijderen en samenvoegen Met de functie append() kun je iets aan een lijst toevoegen. Typ en run: # Voorbeeld 4 Iets aan een lijst toevoegen lijst = [7,8,9] lijst.append(13) print(lijst) Als het goed is print hij als laatste regel: [7, 8, 9, 13] Met het commando del kun je iets uit een lijst verwijderen. Typ en run: # Voorbeeld 5 Iets uit een lijst verwijderen lijst3 = [5,6,7,8] del lijst3[2] print(lijst3) Als het goed is print hij als laatste regel: [5, 6, 8] Met het + teken kun je twee lijsten samenvoegen. Typ en run: # voorbeeld 6 Twee lijsten samenvoegen lijst4 = [11,12,13] lijst5 = [28,33,45,67] nieuweLijst = lijst4 + lijst5 print(nieuweLijst) Als het goed is print hij als laatste regel: [11, 12, 13, 28, 33, 45, 67] 5.4 Lijst in een lijst Typ en run: # Voorbeeld 7 Lijst in een lijst lijst1 = [38,40,42] lijst2 = [3] lijst2.append(lijst1) print(lijst2) Als het goed is print hij als laatste regel: [3, [38, 40, 42]] Het eerste element van de lijst is 3 maar het tweede element is zelf ook weer een lijst. Inhoudsopgave Cursus 25 Inhoudsopgave naslagwerk Door een dubbele index te gebruiken kunnen we elementen uit zo'n lijst in een lijst ophalen. Voeg de volgende regel toe aan de vorige code en run: print(lijst2 [1][2]) Als het goed is print hij als laatste regel: 42 De eerste index 1 geeft aan dat het om het tweede element gaat immers de telling begint bij nul. De tweede index 2 geeft aan dat het om het derde element van dit tweede element gaat. Het nesten van lijsten in lijsten is bijzonder nuttig. Je kunt er bijvoorbeeld een adresboek mee maken. Voorbeeld: adresboek = [ [ “Karel”,”Jansen”, “4302KK”, “Lutjebroek”], [“Hans”, “Worst”, “2211QQ”, “Bommerdam”, ….........] 5.5 Snel vullen, index uitlezen en lengte van de lijst bepalen Een lijst snel vullen met dezelfde elementen gaat met behulp van het vermenigvuldigingsteken *. Dit heb je bijvoorbeeld nodig als alle elementen in een lijst een bepaalde beginwaarde moeten hebben. Typ en run: # Voorbeeld 8 Een lijst snel vullen nulLijst = [6]*10 print(nulLijst) Als het goed is print hij als laatste regel: [6, 6, 6, 6, 6, 6, 6, 6, 6, 6] De index van een bepaald element in een lijst vinden gaat met de index() functie. Typ en run: # Voorbeeld 9 De index van een element vinden print([3,5,7,9].index(5)) Als het goed is komt hier 1 uit want het element 5 bevindt zich op positie 1. Om de lengte van een lijst te bepalen gebruiken we de functie len(). Typ en run: # Voorbeeld 10 De lengte van een lijst bepalen langLijst = [1,2,5,6,6,8,9] print(len(langLijst)) Als het goed is komt hier 7 uit. 5.6 In en not in In een eerdere les ben je al vergelijkingsoperatoren tegen gekomen zoals ==, != en >. Hier volgen er nog twee die je vaak nodig hebt: Inhoudsopgave Cursus 26 Inhoudsopgave naslagwerk Operator A IN B A NOT IN B Omschrijving Waar als A behoort tot de verzameling B Waar als A niet behoort tot de verzameling B Met het volgende programma kun je testen of de kleur die gebruiker invoert behoort tot een verzameling van kleuren. Typ en run: # Voorbeeld 11 IN operator keuze = input("Noem een kleur:") if keuze in ("geel","rood"): print(“Goed geraden.”) 5.7 For lus Lussen in een programma worden ook wel iteraties of herhalingen genoemd. De twee belangrijkste zijn de while-lus en de for-lus. De for lus wordt veel gebruikt om een bepaalde reeks af te lopen. De while lus gebruik je als er een voorwaarde gesteld moet worden om de lus te laten stoppen. Met het volgende opdrachten kun je een reeks uitprinten die in een variabele of lijst zit. Probeer het maar uit. Typ en run: # Voorbeeld 12 For-lus for x in 'Python': print ('Dit is de letter: ' + x) De for lus loopt hier alle tekens van het woord 'Python' af en print ze regel voor regel uit. Typ en run: # Voorbeeld 13 For-lus en lijst fruitlijst = ['banaan', 'appel', 'mango'] for fruit in fruitlijst: print ('We hebben een : ' + fruit) De for lus loopt hier een hele lijst af en print de inhoud van die lijst regel voor regel uit. 5.8 range(start,stop,stapgrootte) In combinatie met een for-lus wordt de functie range veel gebruikt. Het volgende programma print het getal 26, dan drie minder dus 23, dan 20 enzovoort totdat de teller gelijk aan 14 wordt. Dan springt hij uit de lus en stopt het programma. Typ en run: # Voorbeeld 14 range for teller in range(26,14,-3): print(teller) Inhoudsopgave Cursus 27 Inhoudsopgave naslagwerk Opdrachten: 5.9 Gebruik van de index in een lus In het volgende programma wordt gebruik gemaakt van de index. Let op dat de eerste index altijd 0 is. Dus index = 0 hoort bij 'banaan'. De len() functie is hier gebruikt om de lengte van de lijst te bepalen. Voor onderstaand voorbeeld is de lengte van de lijst dus 3. Zo gauw de index 3 wordt stopt de for lus. Typ en run: # Voorbeeld 15 Gebruik van de index fruitlijst = ['banaan', 'appel', 'mango'] for index in range(len(fruitlijst)): print ('Dit soort fruit heet: ' + fruitlijst[index]) Maak alle voorgaande code inactief met ##. Typ # Opgaven les 5 Typ #5.1 5.10 Opgaven 5.1 5.2 5.3 5.4 5.5 5.6 5.7 Maak een lijst met daarin vier dieren. Zorg dat de hele lijst wordt geprint. Maak een programma waarin een lijst met drie kleuren wordt gedefinieerd. Vervolgens moet er op het scherm de vraag komen om nog een kleur te noemen. Deze moet worden toegevoegd aan de lijst. Tenslotte moet de lijst met de vier kleuren worden geprint. Maak een lijst met letters en een andere lijst met getallen. Voeg de twee lijsten samen tot één. Print de nieuwe lijst uit. Maak een lijst van de getallen 1,2, 3 en 4. Haal m.b.v. een index het derde getal eruit en laat dit printen. Maak de volgende lijst mijnLijst = [22,33,44, [5,6,7,8,9]] en haal met behulp van een dubbele index het getal 9 eruit. .Print daarna de hele lijst nogmaals uit. Als je het goed gedaan hebt wordt het getal 9 niet geprint omdat je het hebt verwijderd. Schrijf een programma met een for-lus dat de getallen 100, 130, 160, ….. en zo steeds dertig meer, onder elkaar weergeeft. Het laatste getal moet iets kleiner dan 10000 zijn. Maak een programma dat een lege lijst definieert. Zorg vervolgens met een for lus er voor dat de lijst gevuld wordt met 2, 9, 16 …. en zo steeds zeven erbij. Het laatste getal moet iets kleiner dan 1000 zijn. Print vervolgens het getal met index 77. Als je het goed gedaan hebt komt hier 541 uit. Inhoudsopgave Cursus 28 Inhoudsopgave naslagwerk Les 6 6.1 Tekenen met een for-lus 6.2 While lus en declareren 6.3 Eeuwige lus 6.4 Lus in een lus 6.5 Opgaven 6.1 Tekenen met een for-lus We gaan een vierkant op een slimme manier tekenen. In plaats van vier keer dezelfde twee regels te typen maken we een lus die vier keer herhaald wordt. 1. Typ en run #Voorbeeld 1 Vierkant import turtle venster = turtle.Screen() lola = turtle.Turtle() for i in range(4): lola.forward(100) lola.left(90) venster.exitonclick() Let op dat je de twee onderste regels één Tab (=toets op toetsenbord) inspringing geeft. De ingesprongen regels worden vier keer uitgevoerd. Maak de vorige code inactief met ## en sluit het tekenvenster af door er op te klikken. 2. Typ en run: #Voorbeeld 2 Ster import turtle ster = turtle.Pen() for i in range(3): ster.forward(200) ster.right(150) Je krijgt nu bovenstaande zandloper. De lus wordt nu drie keer uitgevoerd. 3. Pas het getal 3 nu zo aan dat er onderstaande ster ontstaat. Inhoudsopgave Cursus 29 Inhoudsopgave naslagwerk 4. Maak alle bovenstaande code inactief en sluit het tekenvenster af door er op te klikken.. 5. Typ en run onderstaande code: #Voorbeeld 3 Spiraal import turtle venster = turtle.Screen() spiraal = turtle.Turtle() for i in range(40): spiraal.forward(i*5) spiraal.right(144) venster.exitonclick() In dit programmaatje is 144 de hoek waarover gedraaid wordt. Het eerste lijnstuk is 10 x 1 = 10 pixels lang. i wordt echter steeds eentje opgehoogd. Het tweede lijnstuk is dus 10 x 2 is 20 pixels lang enzovoort. Je krijgt de figuur hieronder: 6.2 While lus en declareren Een while lus is een ander type lus. Je kunt er meer mee maar hij is iets lastiger in gebruik. Het volgende programma laat de gebruiker een getal onder de tien raden net zolang tot de gebruiker het raadt. Typ, run en test dit programma: # Voorbeeld 4 While lus import random getal = random.randint(1,9) print(getal) raad = 0 while raad != getal: raad = int(input("Noem een getal onder de 10")) print("Goed geraden") ➔ De derde regel gebruikt de functie randint waarbij je een geheel getal kiest dat minimaal 1 en maximaal 9 is. ➔ De regel print(getal) is voor testdoeleinden zodat je niet eindeloos hoeft te raden. ➔ De regel raad = 0 is nodig omdat anders het programma de variabele “raad” niet Inhoudsopgave Cursus 30 Inhoudsopgave naslagwerk kent bij het begin van de while lus. Dit heet een variabele declareren. ➔ De regel while raad != getal: betekent: Zolang de variabele “raad” niet gelijk is aan de variable “getal”. ➔ In de regel daaronder staat de opdracht die uitgevoerd wordt zolang het getal niet geraden is. ➔ Zo gauw het getal geraden is springt het programma uit de lus en voert de laatste regel van het programma uit. 6.3 Eeuwige lus Bij lussen bestaat altijd het gevaar dat je in een zogenaamde eeuwige lus terecht komt. Het programma blijft dan maar doorgaan en stopt niet uit zichzelf. De oorzaak is dat aan de voorwaarde waardoor de lus stopt nooit wordt voldaan. De oplossing is om de applicatie waarin het programma draait af te sluiten. In windows doe je dit door op <CTR><ALT><DEL> te drukken. Hierdoor kun je taakbeheer openen en bij tabblad “toepassingen” het programma afsluiten. Typ, run en gebruik taakbeheer of klik op het kruisje van het programma om het af te sluiten: # Voorbeeld 5 Eeuwige lus a = 10 while a != 6: a=a+1 print(a) In het programma hierboven blijft a altijd ongelijk aan 6 en zal de lus dus door blijven gaan. 6.4 Lus in een lus Wanneer de opdrachten wat ingewikkelder worden moet een programmeur al gauw zijn toevlucht nemen tot een lus in een lus. Het volgende programma berekent alle veelvouden van 12 die tevens veelvoud van 15 zijn tussen 0 en 500. Je ziet dat in de binnenste lus ook nog een if opdracht zit. Let op de inspringingen. Typ en run: # Voorbeeld 6 Een lus in een lus for a in range(0,500,12): for b in range(0,500,15): if a == b and a != 0: print(a) Als je foutmeldingen krijgt met “indentation” staan de inspringingen niet goed. Dit gebeurt vooral als je kopieert en plakt. Maak alle voorgaande code inactief met ##. Typ # Opgaven les 6 Typ #6.1 Inhoudsopgave Cursus 31 Inhoudsopgave naslagwerk 6.5 Opgaven 6.1. Maak een programma dat onderstaande doolhof maakt. 6.2. Maak een programma dat onderstaande figuur tekent. 6.3. Maak een programma dat onderstaande figuur tekent. Gebruik hierbij een lus in een lus. 6.4. De Nederlandse kroonprinses heet Amalia. Maak een programma met een while-lus dat de gebruiker om de naam van de kroonprinses vraagt. De gebruiker mag net zo lang raden tot hij/zij het goed heeft. Als het goed geraden is moet de mededeling komen “Dat is goed.” Maak een variant van het programma uit de vorige vraag. Deze keer wordt “amalia” met kleine letters ook goed gerekend. Tip: gebruik een andere vergelijkingsoperator. 6.5. Inhoudsopgave Cursus 32 Inhoudsopgave naslagwerk Les 7 7.1 Algoritme 7.2 PSD 7.3 Structorizer 7.4 Teller, break, continue, exit 7.5 Enumerate zorgt voor teller in for lus 7.6 Opgaven Nu de programmeeropdrachten wat lastiger worden is het zaak om de problemen systematisch aan te pakken. 7.1 Algoritme Een algoritme is een stappenplan om een probleem op te lossen. Het algoritme om van een computerprogramma te maken ziet er als volgt uit: 1. 2. 3. 4. 5. 6. Probleemstelling Analyse Schematische oplossing Het maken van de broncode (sourcecode) Compileren Testen In fase 1, de probleemstelling schrijf je precies op wat je wil dat het programma kan. Bij de opgaven tot nu toe was dit al gedaan maar het kan in de toekomst voorkomen dat jij dit samen met je opdrachtgever moet vaststellen. In fase 2, de analysefase probeer je door denkwerk het probleem op te splitsen in deelproblemen. In fase 3 teken je een stroomschema (flowchart) van het softwareprogramma Hierbij wordt veel gebruik gemaakt van programmastructuur-diagrammen, afkorting PSD, ook wel Nassi-Shneiderman Diagram (NSD) genoemd. Hierdoor visualiseer je het probleem waardoor het makkelijker is op te lossen. Hieronder staat een voorbeeld. Schrijf: Wat is je LEEFTIJD? Lees: LEEFTIJD LEEFTIJD < 15 Ja Nee Schrijf: Zolang LEEFTIJD >0 Schrijf: Je bent oud. Schrijf: LEEFTIJD LEEFTIJD = LEEFTIJD -1 Inhoudsopgave Cursus 33 Inhoudsopgave naslagwerk Schrijf: Zoveel jaar kun je nog aftellen. In fase 4 typ je de code. Fase 5, het compileren, is het omzetten van de broncode naar machinetaal. Machinetaal bestaat alleen maar uit enen nullen. Dit gebeurt wanneer je in de editor van Python op “Run” klikt. Wanneer de code niet goed is, krijg je een foutmelding en moet je terug naar fase 4. In fase 6, de testfase geef je allerlei invoer en kijkt of het programma doet wat het moet doen. Als dat niet het geval is moet je vaak terug naar fase 3, de schematische oplossing. Er zit dan een fout in het ontwerp. 7.2 PSD Programmastructuur-diagrammen PSD's zijn programmeertaal onafhankelijk. Er zijn geen strenge taalregels. Het doel is het oplossen van het probleem. De lay-out is erg simpel. PSD's bestaan uit: Rechthoeken Driehoeken Tekst Je kunt een PSD maken met de tekstopties in je tekst verwerker maar er zijn ook speciale programma’s voor. Een PSD kent slechts drie basisstructuren: Sequentie = opeenvolging van handelingen. In het vorige plaatje zie je dat bij de eerste twee regels. Selectie = keuze. Hier moet het programma kiezen tussen handelingen. In het plaatje kun je deze structuur herkennen aan de driehoek. Wanneer er meer dan twee keuze mogelijkheden zijn mag de driehoek ook als hieronder getekend worden: Iteratie = herhaling van handelingen. Dit is in het plaatje het gedeelte met de Lvorm. In het grote vak staat de voorwaarde. Als deze vooraf is begint de voorwaarde met “Zolang”, als deze achteraf is, is de L-vorm gespiegeld en begint de voorwaarde met “Totdat”. Deze structuur komt vanaf les 6 aan bod. Informatica Ga achter de computer zitten Wat is je favoriete vak? Wiskunde Pak een rekenmachine Inhoudsopgave Cursus Anders Biologie Ga het bos in 34 Ga een boek lezen Inhoudsopgave naslagwerk 7.3 Structorizer Structorizer is een portable programma waarmee je PSD’s vrij snel kunt maken en die bovendien je PSD kan omzetten naar code voor verschillende programmeertalen. Op deze site staat een uitgebreidere uitleg: https://sites.google.com/site/structorizer/home Er bestaat ook een onlineversie van dit programma. Nog meer informatie vind je in de userguide die je bij dit programma hebt gekregen. Hieronder ga je aan de hand van drie voorbeelden kennismaken met dit programma. Voorbeeld 1 Drievoud: Bedenk een programma dat vraagt om een getal. Vervolgens moet de computer het getal met 3 vermenigvuldigen en daarna de uitkomst printen. Dit is een sequentie; een opeenvolging van opdrachten. 1. Open het portable programma Structorizer. 2. Klik op het gele vlakje. 3. Typ in het venster dat dan verschijnt met hoofdletters de naam van het programma dat we gaan maken. Noem het programma “DRIEVOUD”. 4. Klik daarna op OK. Inhoudsopgave Cursus 35 Inhoudsopgave naslagwerk 5. Klik op het gele vakje linksboven totdat de icoontjes erboven zichtbaar worden. 6. Klik op het meest linkse icoontje van “Add new instruction”. 7. In het venster wat dan verschijnt typ je INPUT "Noem een getal" a. Je moet altijd INPUT schrijven doen als het programma de gebruiker om gegevens vraagt. 8. Klik daarna op OK. 9. Klik weer op “Add new instruction”. 10. Typ hierin b <- a*3 en klik op OK. Het < – teken wordt omgezet in een pijltje. 11. Klik weer op “Add new instruction”. 12. Typ OUTPUT b Je moet altijd OUTPUT typen voor een print opdracht. Klik daarna op OK. Het programma ziet er nu uit zoals hierboven. 13. Kies nu in het menu “Debug, Executer” en klik op het pijltje om het programma te runnen. 14. Kies in het menu “file, save” en sla het bestand op in de map van “python, les_7”. Het wordt opgeslagen als met de extensie .nsd. Als je later wat wilt veranderen of je wilt dit diagram gebruiken als basis voor een nieuw diagram dan heb je dit bestand nodig. 15. Kies in het menu “file, export, picture, pdf” en sla het bestand op in de map van “python, les_7”. 16. Kies in het menu “file, export, code, python” en sla het bestand op in de map van “python, les_7”. Je ziet hier dat je het programma ook naar andere programmeertalen kunt vertalen. 17. Open het bestand in je python editor en run het. Je merkt dat het programma nog niet precies doet wat het moet doen. 18. Verbeter het programma totdat het juist werkt. Voorbeeld 2 Getallen vergelijken Bedenk een programma dat vraagt om twee getallen. Wanneer het eerste getal groter is moet de computer “De eerste was groter” printen. Wanneer het tweede getal groter is moet de computer “De tweede was groter.” printen en als ze gelijk zijn moet de computer printen: “Ze waren even groot.” Dit is een selectie; een keuze. 19. Maak in Structorizer een nieuw bestand aan en noem dit “GETALLEN Inhoudsopgave Cursus 36 Inhoudsopgave naslagwerk VERGELIJKEN”. 20. Maak een INPUT opdracht voor het eerste getal. 21. Maak een INPUT opdracht voor het tweede getal. 22. Kies nu inbovenin voor het tweede icoontje van links: de IF opdracht. 23. Noteer (a>b) zoals hierboven in het venster wat dan verschijnt en klik op OK. Het volgende plaatje verschijnt: 24. De T is van True (waar) en de F van False ( niet waar). Omdat structorizer geen “elif” kent klikken we op het vakje onder False en kiezen weer voor de IF opdracht. Noteer in deze opdracht (a<b) en klik op OK. Je krijgt dan het volgende te zien. 25. Voer nu in de drie vakjes eronder de drie OUTPUT opdrachten in zoals ze in de opdracht omschreven staan. Uiteindelijk krijg je het volgende Programma Structuur Diagram (PSD). Inhoudsopgave Cursus 37 Inhoudsopgave naslagwerk 26. Test nu het programma via “Debug, Executer” voor de drie verschillende situaties. 27. Sla het programma op als .nsd Nassi-Shneiderman Diagram zodat je het eventueel later kunt gebruiken voor andere opdrachten. 28. Exporteer het als pdf. 29. Exporteer het als code naar Python. 30. Test het programma voor de drie verschillende situaties in de Python editor. Je bruik met name de getallen 21 en 9. Je zult zien dat het dan mis gaat. Verbeter het programma en test net zo lang tot het programma goed werkt. Voorbeeld 3 Getal raden In dit voorbeeld gaan we een iteratie zien oftewel een herhaling oftewel een lus. Laat de computer een een willekeurig geheel positief getal onder de tien genereren. Voor testdoeleinden moet dit getal op het scherm komen. Laat de gebruiker het getal raden net zo lang tot het goed is. Als dat het geval is moet er op het scherm komen “Goed geraden”. 31. Maak in Structorizer een nieuw bestand aan en noem dit “GETAL RADEN”. 32. Je moet nu de random functie van structorizer weten. Open de user guide met F1. Zoek in de pdf (CTRL F) op “random”. 33. Maak de opdracht waarmee de computer een willekeurig getal onder de tien kiest. 34. Test via “Debug, Executor” of je notatie goed is. Kijk anders nog eens naar voorbeeld 1. 35. Maak de opdracht waarmee dit getal naar het scherm wordt geschreven. 36. Maak de opdracht voor de WHILE lus. Dit is het vijfde icoontje. Het symbool voor “niet gelijk aan” kun je vinden op dezelfde pagina van de help als waar je zojuist was. je kunt ook gewoon proberen want Structorizor ondersteunt de meest gebruikte symbolen uit de diverse programmeertalen. Klik daarna op OK. 37. Maak vervolgens in de WHILE lus de opdracht om de gebruiker het getal te laten raden en klik op OK. 38. Als het getal geraden wordt springt het programma uit de WHILE lus naar de eerst volgende regel. Maak hier de opdracht om “Goed geraden” naar het scherm te schrijven. Pas op dat deze opdracht niet in de WHILE lus staat. Klik op OK. Uiteindelijk moet het er als volgt uitzien: Inhoudsopgave Cursus 38 Inhoudsopgave naslagwerk 39. Test nu het programma via “Debug, Executer”.. 40. Sla het programma op als Nassi-Shneiderman Diagram zodat je het eventueel later kunt gebruiken voor andere opdrachten. 41. Exporteer het als pdf. 42. Exporteer het als code naar Python. 43. Test het programma in je Python editor. Daarbij zul je o.a. op zoek moeten naar de juiste notatie voor de random functie. Klik daarvoor onder aan de pagina op “Inhoudsopgave naslagwerk”, kies voor “Documenten” en gebruik de link voor de officiële documentatie van Python3. Bij Global Module Index moet je opzoek naar de random module. Hoe je module moet importeren heb je eerder gehad. daarna moet je nog twee problemen oplossen. 7.4 Teller, break, continue, exit In deze paragraaf leer je wat opdrachten die je kunt gebruiken bij lussen. Teller Hiermee kun je bijhouden hoever je in een lus zit. Break Hiermee spring je uit een lus of if opdracht en ga je verder met de eerst volgende opdracht na de lus of if opdracht. Continue Hiermee maak je de huidige lusdoorgang niet af maar spring je gelijk door naar het begin van de lus om te beginnen met de volgende lusdoorgang. Exit Hiermee stop je het programma. Voorbeeld 4 Minilandjes In het volgende programma is het de bedoeling de vijf kleinste landen van Europa te raden. Het raden gaat net zolang door tot ze alle vijf geraden zijn. Iedere keer als er een land geraden wordt, dan wordt dit naar het scherm geschreven behalve de derde keer. de PSD in structorizer ziet er als volgt uit: ➢ land is een lijst met daarin de goede antwoorden. Let op: in structorizer is dit met accolades. ➢ t is een teller die bijhoudt hoeveel goede antwoorden er zijn gegeven. Hij wordt in het begin op nul gezet. Bij een while lus is dit nodig. ➢ al_gehad is een lijst waarin de reeds gegeven goede antwoorden worden opgeslagen. In het begin worden er nep antwoorden in gestopt. Inhoudsopgave Cursus 39 Inhoudsopgave naslagwerk ➢ while t < 5: De teller t houdt bij hoeveel goede antwoorden er gegeven zijn. Verderop zie je t←t+1. Dan is er net een goed antwoord gegeven en gaat de teller eentje omhoog. De while lus wordt dus vaker dan vijf keer doorlopen want bij een fout antwoord gaat de teller niet omhoog. Als t = 5 springt het programma uit de lus naar de laatste regel. ➢ for i ← 0 to 4 Deze for lus bevindt zich binnen de while lus. In deze lus wordt gecontroleerd of een goed antwoord niet al eerder is gegeven en wordt de al_gehad() lijst gevuld met goed gegeven antwoorden. Na ieder goed antwoord gaat er OUTPUT naar het scherm behalve de derde keer. In Structorizer wordt de 4 meegerekend als lusdoorgang. ➢ leave zorgt ervoor dat uit de for-lus wordt gesprongen. In de meeste talen heet dit “break”. Het programma blijft echter wel in de while-lus. De buitenlus gaat door totdat de teller t = 5 is geworden. Dan zijn alle goede antwoorden gegeven. Inhoudsopgave Cursus 40 Inhoudsopgave naslagwerk Wanneer je dit omzet naar code blijkt dat “leave” automatisch is omgezet naar “break”. Er staat wel een foutmelding achter maar die is vals. Verder moeten er twee puntjes verbeterd worden. Bij de laatste if in de PSD stond geen actie. Dat mag in Python niet en dan gebruik je dus continue. Verder wordt in de random-functie van python de rechter grens niet meegenomen dus de 4 in de for-lus wordt een 5. Hier kom je alleen maar achter als je alles goed test. TESTEN IS BELANGRIJK!! 7.5 Enumerate zorgt voor teller in for lus In een for lus mis je soms een teller. Met de enumerate() functie kun je die maken. Hij voegt een teller toe aan iedere element uit de lijst waarop je de for lus laat werken. Wanneer je de for lus laat printen kun je op die manier regelnummer creëren. Probeer de volgende voorbeelden uit en sla het bestand op als “les_7” in de map “les_7”. Voorbeeld 5 enumerate meubel = {'kast', 'tafel', 'stoel'} for teller, item in enumerate(meubel): print(teller, item) Voorbeeld 6 Teller bij een ander getal laten beginnen meubel = {'kast', 'tafel', 'stoel'} for teller, item in enumerate(meubel,30): print(teller, item) 7.6 Opgaven 7.1 Maak een PSD voor een programma “SELECTIE” dat eerst vraagt naar je Inhoudsopgave Cursus 41 Inhoudsopgave naslagwerk 7.2 7.3 7.4 7.5 leeftijd. Als je ouder dan 18 jaar bent antwoord het programma met “Afgewezen”. Als je jonger dan 18 jaar bent vraagt het programma op welk geheel uur ga je meestal naar bed. Als dit groter dan 10 is, antwoord het programma met “Te laat”. In het andere geval zegt het programma “Je bent aangenomen”. Sla het bestand op in de map van “Python, les 7”. Zet de PSD om naar code en zorg dat het werkt. Sla het bestand op in de map van “Python, les 7”. Maak een PSD voor een programma “EINSTEIN” dat vraagt naar de voornaam van de beroemde wetenschapper Einstein. Als het antwoord “Albert” of “albert” is moet het programma antwoorden met “Prima”. Als het antwoord anders is moet het programma de vraag opnieuw stellen. Zet de PSD om naar code en zorg dat het werkt. Sla het bestand op in de map van “Python, les 7”. Maak een programma “GEEN_APPEL” dat begint met een lijst van zeven vruchten. Zorg dat “appel” twee keer in de lijst staat. Daarna moet de lijst ingelezen worden en alle vruchten onder elkaar printen behalve “appel” ongeacht waar deze in de lijst staat. Tip: Gebruik een for-lus. Zie les 5. Kies je voorwaarde verplicht zo dat je de opdracht “continue” nodig hebt. Je hoeft geen PSD te maken. Appel mag niet uit de lijst gewist worden. Een voorbeeld van de output staat hieronder: Inhoudsopgave Cursus 42 Inhoudsopgave naslagwerk Les 8 8.1 Tuples 8.2 Dictionaries 8.3 Lezen van en schrijven in bestanden met de with opdracht 8.4 Lezen van en schrijven in dictionairies 8.5 Opgaven Maak een leeg bestand “les_8” en sla het op in de map “python, les_8”. 8.1 Tuples Tuples lijken heel veel op lijsten. Ze hebben bijvoorbeeld ook een index. Het grote verschil is dat als ze eenmaal gemaakt zijn, ze niet meer veranderd kunnen worden. je kunt ze alleen nog maar verwijderen. Tuples maak je met gewone haakjes ( ). Typ en run: # Voorbeeld 1 Tuple maken eenTuple = (2,4,6,8) print(eenTuple[1]) eenTuple[2] = 7 Het element “4” wordt nog wel afgedrukt maar je krijgt een foutmelding op de derde regel omdat je een tuple niet kunt veranderen. Je kunt uit een tuple wel een andere tuple maken. Dit gaat als volgt: Typ en run: # Voorbeeld 2 Een nieuwe tuple maken uit een andere tuple tup1 = (1,2,3) tup2 = tup1 + (4,) # de komma maakt er een tuple van anders is het een integer print (tup2) Je kunt geen tuples en integers optellen, wel tuples en tuples. 8.2 Dictionaries Dictionaries (woordenboeken) worden ook wel hashes genoemd. Ze hebben veel gemeen met lijsten. Het grote verschil is dat de indices niet 0,1,2 enzovoort heten maar dat je de indices zelf een naam mag geven. De index wordt daarom een key (sleutel) genoemd. Woordenboeken maak je met accolades { }. Typ en run: # Voorbeeld 3 woordenboek met daarin lijsten als elementen adresBoek = { 'Henk' : ['Paling', '4200UU','Lutjebroek', '0123456789'], 'Hans' : ['Worst', '1122TT', 'Dommeldam', '0687654321'] } # 'Henk' en 'Hans' zijn hier de sleutelwoorden (keys) van de verschillende rijen. Inhoudsopgave Cursus 43 Inhoudsopgave naslagwerk print (adresBoek['Henk']) print (adresBoek['Hans'][3]) # Je kunt de indices van de lijsten een naam geven achterNaam = 0 postCode = 1 stad = 2 tel = 3 print (adresBoek['Hans'][stad]) # Sleutelwoorden ophalen met de functie keys() print (adresBoek.keys()) 8.3 Lezen van en schrijven in bestanden met de with opdracht In games en op websites moet vaak informatie bewaard worden die later weer gelezen moet kunnen worden. Je game kun je bijvoorbeeld opslaan (saven). Via een website kunnen de adresgegevens van iemand worden opgeslagen. Opmerking: Lezen van en schrijven naar files gaat in python 3 anders dan in python 2. With opdracht In python 3 gebruik je hiervoor de with opdracht. Deze opdracht werkt met objecten. In de lessen over object georiënteerd programmeren zullen we dit dieper uitleggen. Probeer de voorbeeldcode hieronder stukje voor stukje uit. Door de code te typen in plaats van te kopiëren laat de python editor meer mogelijkheden zien. Voorbeeld 4: openen, (over)schrijven en afsluiten Typ en run: with open('schrijfbestand_1.log', mode = "w", encoding='utf-8') as var_1: var_1.write("test geslaagd") # Het with statement is de manier om in python 3 naar bestanden te schrijven of ze te lezen. Let op de dubbele punt en het woordje "as". # Eerst wordt het bestand geopend. De mode "w" geeft aan dat als er al iets stond dit overschreven wordt. # Aan het object "schrijfbestand_1.log" wordt de variabele "var_1" gekoppeld. # "var_1.write" zorgt ervoor dat er iets in "schrijfbestand_1.log" wordt geschreven. # Wanneer de "with" opdracht klaar is wordt het bestand automatisch gesloten. Hierdoor wordt het systeem niet onnodig belast door geopende bestanden, die op dat moment niet gebruikt worden. Kijk in de map waar je het bestand "schrijfbestand_1.log" hebt opgeslagen. Lees dit bestand met kladblok. Als het goed is staat er “test geslaagd” in. Voorbeeld 5: lezen Typ en run: with open('schrijfbestand_1.log', encoding='utf-8') as var_1: print(var_1.read()) Inhoudsopgave Cursus 44 Inhoudsopgave naslagwerk # "test geslaagd" komt op het scherm. Zo lees je in python 3 dus bestanden. Voorbeeld 6: toevoegen Typ en run: with open('schrijfbestand_1.log', mode = "a", encoding='utf-8') as var_1: var_1.write("\n" + "een nieuwe regel") # met "a" van append voeg je regels toe. # "\n" van newline zorgt ervoor dat wat daarna komt op een nieuwe regel komt. Voorbeeld 7: opnieuw lezen Typ en run: with open('schrijfbestand_1.log', encoding='utf-8') as var_1: print(var_1.read()) Voorbeeld 8: Naar een bestand in een mapje schrijven Maak eerst een mapje "schrijfbestanden" in de map waarin dit bestand staat. Typ en run: with open('schrijfbestanden/schrijfbestand_2.txt', mode = "w", encoding='utf-8') as var_2: var_2.write("test2 geslaagd") 8.4 Lezen van en schrijven in dictionairies Dictionary Een dictionary (woordenboek) bestaat uit elementen die je kunt aanpassen. Ieder element bestaat uit twee delen: een key (sleutel) en een value (waarde). Het verschil met een lijst is dat de key de plaats van de index inneemt. Voorbeeld: key voornaam achternaam value Johan Maaswolf Op de plaats van de waarde (value) wordt steeds wat anders ingevoerd. Voorbeeld 9: Een dictionary maken Typ en run: woordenboek = {'voornaam': 'Johan', 'achternaam': 'Maaswolf'} # voornaam en achternaam zijn sleutels (keys), Johan en Maaswolf zijn waarden (values) Voorbeeld 10: Een dictionary lezen en printen; roep de sleutel aan en je krijgt de waarde: Typ en run: print (woordenboek['voornaam']) # Let op de aanhalingstekens Voorbeeld 11: Iets uit een dictionary verwijderen Inhoudsopgave Cursus 45 Inhoudsopgave naslagwerk Typ en run: woordenboek = {'voornaam': 'Johan', 'achternaam': 'Maaswolf'} del(woordenboek['voornaam']) print(woordenboek) Voorbeeld 12: Variabelen gebruiken met een dictionary Typ en run: woordenboek = {} # Hier wordt de dictionary gedefineerd. var_1 = 'voornaam' var_2 = 'Trudy' woordenboek[var_1] = var_2 print(woordenboek) Voorbeeld 13: Een dictionary in een bestand schrijven met de functie items() Typ en run: woordenboek = {'voornaam': 'Johan', 'achternaam': 'Maaswolf'} with open('schrijfbestand_3.txt', mode = "a", encoding='utf-8') as bewaar: for voornaam, achternaam in woordenboek.items(): bewaar.write(voornaam + '\n') bewaar.write(achternaam + '\n') Voorbeeld 14: Van een bestand een dictionary maken Maak een kladblok bestand genaamd "schrijfbestand_4.txt" en typ daarin het volgende: voornaam;Piet achternaam;Klop Eindig iedere regel met een <enter> voor "nieuwe regel". Typ en run: woordenboek = {} with open('schrijfbestand_4.txt', mode = "r", encoding='utf-8') as bewaar: for regel in bewaar: regel = regel[:-1] # verwijdert het laatste teken; "\n" sleutel, waarde = regel.split(";") # splitst de regel bij de puntkomma in twee variabelen woordenboek[sleutel] = waarde print(woordenboek) 8.5 Opgaven 8.1 8.2 8.3 8.4 Maak een tuple van zes dieren. Zorg dat het eerste dier geprint wordt. Print met behulp van een key en een index het woordje “Worst” uit het onderstaande adresboek. adressBoek = { 'Henk' : ['Paling', '4200UU','Lutjebroek', '0123456789'], 'Hans' : ['Worst', '1122TT', 'Dommeldam', '0687654321'] } Maak een programma dat de volgende tekst in het bestand “ikkanschrijven.txt” in de map “opslagmap1” opslaat: “Het is me gelukt om tekst in een bestand te schrijven.” Vergeet niet om die map van tevoren aan te maken in de map van “les_8”. Controleer zelf of het gelukt is. Maak een programma dat deze tekst kan uit het bestand kan lezen en printen. Inhoudsopgave Cursus 46 Inhoudsopgave naslagwerk 8.5 8.6 Maak een programma dat de volgende tekst aan het bestand “ikkanschrijven.txt” kan toevoegen op een nieuwe regel: “Het toevoegen is nu ook gelukt.” Vervolgens moet de hele tekst gelezen worden en geprint. Maak een programma dat vraagt om de naam van een voetbalclub in te vullen en dat deze naam toevoegt op een nieuwe regel aan het bestand “ikkanschrijven.txt”. Vervolgens moet de hele tekst gelezen worden en geprint. Opdracht 8.7 Maak een programma dat een dictionary maakt waarbij de voetbalclubs de keys zijn en de steden waarvoor ze spelen de values. Kies zelf drie clubs met steden. Breid het programma uit met een regel die de hele dictionary print. Breid het programma uit met een regel die alleen de stad noemt die bij de eerste club hoort. Breid het programma uit met een regel die de steden noemt bij de eerste twee clubs. Breid het programma uit zodat het programma vraagt om een club en daarna een stad in te vullen. Hiermee moet de dictionary worden aangevuld. Print daarna de hele dictionary. Breid het programma uit zodat het vraagt welke club je wilt verwijderen. De club wordt verwijderd en de hele dictionary wordt geprint. Opdracht 8.8 Maak een programma dat een dictionary maakt waarbij de voetbalclubs de keys zijn en de steden waarvoor ze spelen de values. Kies zelf drie clubs met steden. Zorg dat het programma de dictionary wegschrijft naar een bestand “clubs.txt” in de map “opslagmap1”. Op iedere regel moet een club en zijn stad staan gescheiden door een komma. Controleer zelf of het goed is weggeschreven. Opdracht 8.9 Maak een programma dat het bestand “clubs.txt” in de map “opslagmap1” uit de vorige opgave leest, in een dictionary zet en de hele dictionary print. Opdracht 8.10 combineert oude en nieuwe kennis Maak een programma dat alleen de tweede regel van het bestand “clubs.txt” uit opgave 8.2 leest en de stad print die bij de tweede club hoort. Tip: het programma lijkt veel op dat van de vorige opgave. Opdracht 8.11 vereist wat zoekwerk op internet Maak een programma dat het bestand “clubs.txt” in de map “opslagmap1” leest, de clubs sorteert op alfabet, print en gesorteerd in het bestand “clubs_2.txt” in de map “opslagmap1” wegschrijft. Tip: je hebt een sorteerfunctie nodig. Aangezien dictionairies geen sorteerfuncties kennen moet je van de dingen die je wilt sorteren eerst een lijst maken. Inhoudsopgave Cursus 47 Inhoudsopgave naslagwerk Les 9 9.1 Modulair werken met zelfgemaakte functies 9.2 Telefoonlijst 9.3 Een database maken 9.4 Scope 9.5 Opgaven 9.1 Modulair werken met zelfgemaakte functies Wanneer een programma wat groter wordt en verschillende functies worden vaker aangeroepen, dan is het verstandig om modulair te werken. De verschillende functies worden gedefinieerd met “def” en worden aangeroepen vanuit het hoofdprogramma. Je kunt zelfs het hoofdprogramma definiëren en vervolgens aanroepen met het volgende zinnetje: if __name__ == "__main__": main() Het volgende voorbeeld demonstreert de werking van een telefoonlijst. Hierbij wordt gebruik gemaakt van een dictionary (woordenboek). 9.2 Telefoonlijst Opdracht Om kopieer en plakfouten te voorkomen kun je onderstaand programma “modulair.py” downloaden uit de map “startbestanden”. Sla het op in de map “les_9”. Probeer onderstaand programma uit en zorg dat je snapt hoe het werkt. Kies eerst een paar keer 2. Kies vervolgens 1. Kies daarna 6 en sla het bestand op als “telefoonlijst.txt” in de map “les_9”. Probeer daarna de andere opties uit. # Een telefoonlijst # Eerst worden alle zelfgemaakte functies gedefinieerd. Deze worden later in het # hoofdprogramma "main" aangeroepen. # Pas daarna wordt het hoofdprogramma "main" gedefinieerd. Anders zouden de # zelfgemaakte functies niet herkend worden. # Met de opdracht if __name__ == '__main__': main() laat men het hoofdprogramma # werken. Op deze manier is het programma ook vanuit andere programma's aan te roepen. def print_nummers(nummers): print("Telefoonnummers:") for k, v in nummers.items(): print("naam:", k, "\tnummer:", v) print() def toevoegen_nummer(nummers, naam, nummer): nummers[naam] = nummer print("Het telefoonnummer van " + naam + " is toegevoegd.") def zoeken_nummer(nummers, naam): if naam in nummers: print("Het nummer van " + naam + " is " + nummers[naam]) Inhoudsopgave Cursus 48 Inhoudsopgave naslagwerk else: print(naam + " is niet gevonden.") def verwijderen_nummer(nummers, naam): if naam in nummers: del nummers[naam] print("Het telefoonnummer van " + naam + " is verwijderd.") else: print(naam," is niet gevonden.") def ophalen_nummers(nummers, bestandsnaam): with open(bestandsnaam, encoding='utf-8') as var_3: for regel in var_3: regel = regel[:-1] # verwijdert het laatste teken; "\n" naam, nummer = regel.split(",") # splitst de regel bij de komma in twee variabelen nummers[naam] = nummer # dictionary "nummers" heeft als key "naam" en als value "nummer" def bewaren_nummers(nummers, bestandsnaam): with open(bestandsnaam, "w",encoding='utf-8') as var_4: for k, v in nummers.items(): var_4.write(k + "," + v + "\n") def print_menu(): print('1. Print telefoonnummers') print('2. Voeg een telefoonnummer toe') print('3. Verwijder een telefoonnummer') print('4. Zoek een telefoonnummer op') print('5. Haal telefoonnummers op') print('6. Bewaar telefoonnummers') print('7. Stop') print() def main(): telefoon_lijst = {} keuzemenu = 0 print_menu() while True: keuzemenu = int(input("Typ een nummer (1-7): ")) if keuzemenu == 1: print_nummers(telefoon_lijst) elif keuzemenu == 2: print("Voeg toe naam en nummer") naam = input("naam: ") telefoon = input("nummer: ") toevoegen_nummer(telefoon_lijst, naam, telefoon) elif keuzemenu == 3: print("Verwijder naam en nummer") naam = input("naam: ") Inhoudsopgave Cursus 49 Inhoudsopgave naslagwerk verwijderen_nummer(telefoon_lijst, naam) elif keuzemenu == 4: print("Zoek nummer") naam = input("naam: ") zoeken_nummer(telefoon_lijst, naam) elif keuzemenu == 5: bestandsnaam = input("naam van het te laden bestand met extensie: ") ophalen_nummers(telefoon_lijst, bestandsnaam) elif keuzemenu == 6: bestandsnaam = input("naam van bestand met extensie dat je gaat bewaren: ") bewaren_nummers(telefoon_lijst, bestandsnaam) elif keuzemenu == 7: break else: print_menu() print("Tot ziens") if __name__ == '__main__': main() 9.3 Een database maken Het nadeel van een dictionary is dat het maar twee velden heeft. Je kunt ook maar op één eigenschap zoeken. Door een heleboel dictionaries in een lijst te stoppen kun je een database maken waarbij je op alle velden kunt zoeken. Samengevat ziet dat er als volgt uit: lijst = [dict1,dict2, dict3,....] of lijst = [{ }, { }, { }......] Opdracht: Sla de volgende voorbeelden op in een bestand dat je “les_9.py” noemt en probeer alles uit. Voorbeeld 1: Database adresboek aanmaken adresboek = [ {"id":1,"voornaam":"Piet","tussenvoegsel":"de","achternaam":"Kok", "woonplaats":"Rijsbergen","telefoonnr":"0644445555" }, {"id":2,"voornaam":"Saskia","tussenvoegsel":"","achternaam":"Kok", "woonplaats":"Hoeven","telefoonnr":"0644335555" }, {"id":3,"voornaam":"Jan","tussenvoegsel":"de","achternaam":"Schaffelaar", "woonplaats":"Etten-Leur","telefoonnr":"0644222555" } ] Voorbeeld 2: Een database printen print(adresboek) Inhoudsopgave Cursus 50 Inhoudsopgave naslagwerk Voorbeeld 3 Printen van een deel van de database for x in adresboek: print(x["id"], x["achternaam"], x["telefoonnr"]) Voorbeeld 4 Een eigenschap verwijderen uit de database for x in adresboek: del x["id"] print(adresboek) Voorbeeld 5 Een eigenschap toevoegen aan een database for x in adresboek: x["postcode"]="0000AA" # Hier wordt de eigenschap postcode toegevoegd print(adresboek) Voorbeeld 6 Een waarde veranderen in een database adresboek[2]["postcode"]="4900BB" # verandert de postcode van de derde persoon print(adresboek[2]) Voorbeeld 7 Een rij verwijderen uit de database # Dit programma kan slechts één naam tegelijk verwijderen. Als er dus twee mensen # met dezelfde achternaam zijn verwijdert hij er maar eentje. anaam = input("Noem de achternaam van wie je alle gegevens wilt wissen. ") index = 0 # Dit is de index van de lijst for x in adresboek: if x["achternaam"] == anaam: del adresboek[index] break index = index + 1 print(adresboek) 9.4 Scope Met de scope van een variabele bedoelen we het bereik van de variabele. Dit is het gebied waar de variabele herkent wordt. Er zijn meerdere niveaus van scope. De belangrijkste twee zijn “Local” (plaatselijk) en “Global” (overal). Plak onderstaande voorbeelden in “les_9” en probeer ze uit Voorbeeld 8 Scope 1 globalVar = "Ik ben een global variabele" def myFunction(): localVar = "Ik ben een local variabele" print("Regel_1 " + localVar) print("Regel_2 " + globalVar) myFunction() print("Regel_3 " + globalVar) print("Regel_4 " + localVar) Inhoudsopgave Cursus 51 Inhoudsopgave naslagwerk Wanneer je bovenstaand voorbeeld runt krijg je de foutmelding in de onderste regel dat “localVar” niet gedefinieerd is. Dat klopt want “localVar” is alleen bekend binnen “myFunction()”. In het volgende voorbeeld voegen we één regel toe aan myFunction() Voorbeeld 9 Scope 2 globalVar = "Ik ben een global variabele" def myFunction(): localVar = "Ik ben een local variabele" globalVar = "Ik ben ook een local variabele" print("Regel_1 " + localVar) print("Regel_2 " + globalVar) myFunction() print("Regel_3 " + globalVar) print("Regel_4 " + localVar) Wanneer je dit programma runt zul je zien dat globalVar in regel 2 en 3 verschillende waarden geeft. De globalVar uit het hoofdprogramma wordt in myFunction() niet herkent. Binnen myFunction wordt dus een nieuwe globalVar aangemaakt. Er zijn nu dus twee variabelen met dezelfde naam. Om variabelenamen ook buiten een functie te laten werken moet je er het woordje global voor zetten. Zie het volgende voorbeeld. Voorbeeld 10 Variabelen globaal maken globalVar = "Ik ben een global variabele" def myFunction(): global globalVar localVar = "Ik ben een local variabele" globalVar = "Ik ben ook een local variabele" print("Regel_1 " + localVar) print("Regel_2 " + globalVar) myFunction() print("Regel_3 " + globalVar) print("Regel_4 " + localVar) Nu geven regel 2 en 3 dezelfde waarden. Dit komt omdat globalVar nu binnen myFunction wordt herkend. 9.5 Opgaven Opdracht 9.1 Maak een programma dat het adresboek uit voorbeeld 1 bevat en dat vraagt “Noem de achternaam van wie je het telefoonnummer wilt weten.” Vervolgens wordt er dan een lijstje Inhoudsopgave Cursus 52 Inhoudsopgave naslagwerk geprint van mensen met dezelfde achternaam. Sla dit programma op als “telefoonNummerZoeken.py” in de map “les_9” Opdracht 9.2 (Alleen voor de betere programmeurs) Maak een programma zoals de de telefoonlijst hierboven maar dan voor het adresboek uit voorbeeld 1 met de eigenschappen voornaam, achternaam en telefoonnummer. Sla dit bestand op als “adresBoek.py” in de map “les_9”. De bedoeling is dat het adresboek net als de telefoonlijst naar een .txt bestand wordt geschreven en ook uit dit .txt betand kan worden gelezen. Het programma moet de volgende menu keuzes hebben: 1 Print iedere achternaam met telefoonnummer. 2 Voeg de gegevens van een nieuwe persoon toe. 3 Wis gegevens van iemand wiens achternaam je kunt invoeren. 4 Zoek het telefoonnummer van iemand op. 5 Haal het adresboek uit een .txt bestand. 6 Bewaar de database in een .txt bestand. 7 Stop. Tip: Kopieer de telefoonlijst en vermaak deze. Werk functie voor functie af en maak regels die je nog niet gebruikt commentaarregels. Inhoudsopgave Cursus 53 Inhoudsopgave naslagwerk Les 10 10.1 Error Handling 10.2 Opgaven blok 1 10.3 Debugging 10.4 Stepping 10.5 Breakpoints 10.6 Opgaven blok 2 10.1 Error Handling Error handling betekent verwerking van fouten. Exceptions Letterlijk vertaald: uitzonderingen. Wat is een “exception”? Meestal is het een fout. Wanneer er een fout optreed in Python bij de uitvoering van de code wordt er een foutmelding gegeven en niet meer dan dat. Dit heet een “unhandled exception”. Toen de fout optrad was er geen speciale code in het programma om de fout op te merken en om er iets mee te doen. Zolang je het programma aan het testen bent is dat niet erg maar als het programma eenmaal in gebruik is wil je niet dat een fout hele programma laat crashen. Oorzaken Soms heb je te maken met fouten in de code (bugs) bijvoorbeeld een variabele die niet gedefinieerd is. Soms echter heb je te maken met fouten waar je wel wat mee kunt, bijvoorbeeld het openen van een bestand dat niet bestaat of het importeren van een module die niet geïnstalleerd, of de database waarmee je contact wil leggen is niet beschikbaar of je hebt geen recht op toegang tot de database. Verder kan de gebruiker iets hebben ingevoerd waar het programma niets mee kan bijvoorbeeld letters in plaats van cijfers om mee te rekenen. Dit zijn fouten waarvan je kunt verwachten dat ze wel eens optreden. Je kunt code maken om te zorgen dat als zoiets optreedt, er op gereageerd wordt zonder dat het hele programma meteen crashed. Try … except en raise Om te voorkomen dat je hele programma vervuild raakt met regels die moeten reageren op allerlei mogelijke fouten kun je in Python gebruik maken van een try .. except blok. Dit werkt hetzelfde als if …. then. Voorbeeld 1 Maak een leeg bestand aan dat je “les_10” noemt. Sla het op in de map “les_10”. Probeer het voorbeeld hieronder uit en controleer of er inderdaad een bestand “foutmelding.txt” wordt aangemaakt als er door nul wordt gedeeld. Maak de fout nogmaals en je zult zien dat er in het tekstbestand een regel wordt toegevoegd. Lees ook de toelichting onder het voorbeeld. # Voorbeeld 1 Error Handling def f(dag): try: return 365/(30-int(dag)) except ZeroDivisionError: with open('foutmelding.txt', mode ='a', encoding = 'utf-8') as logfile: logfile.write("Het ingevoerde getal was 30 en dat mag niet want dan deel je door nul. \n") Inhoudsopgave Cursus 54 Inhoudsopgave naslagwerk raise try: dag = input("Noem de dag van de maand: ") print(f(dag)) except ZeroDivisionError: print ("Je kunt niet door 0 delen. Probeer een ander getal.") # In het programma hierboven wordt eerst de functie f gedefinieerd. De functie zelf # staat in het gedeelte van "try". # "return" zorgt ervoor dat de uitkomst van deze functie wordt teruggestuurd naar het # hoofdprogramma. # Wanneer er 30 wordt ingevoerd krijg je een deling door nul en zal Python automatisch # een ZeroDivisionError geven. Deze wordt onderschept met "except". In plaats van dat # de gebruiker de ZeroDivisionError te zien krijgt en het programma vastloopt wordt # er een foutmelding naar 'foutmelding.txt' wordt geschreven. # Het sleutelwoord "raise" zorgt ervoor dat de gebruiker het zinnetje # "Je kunt niet door 0 delen. Probeer een ander getal." te zien krijgt. # "raise" zorgt ervoor dat er vanuit de functie f een signaal terug wordt gezonden # en dat de actie die bij ZerodivisionError in het hoofdprogramma staat, moet # worden uitgevoerd. # # Het hoofdprogramma onderaan begint met een "try" blok waarin het eigenlijke # programma staat. Alleen wanneer er met het "raise" sleutelwoord een ZeroDivisionError # wordt gemeld wordt het gedeelte onder "except:" uitgevoerd. 10.2 Opgaven blok 1 Sla de volgende opgaven op in het bestand “les_10.py” Opgave 10.1 Vermaak het programma hierboven zo dat de gebruiker na een foutmelding opnieuw een waarde kan invoeren en het programma dus opnieuw wordt gedraaid. Opgave 10.2 Open het programma “modulair.py” uit de map “startbestanden” en sla het op in de map “les_10” . Wanneer je bij dit programma bij het keuzemenu iets anders dan een getal invoert krijg je een bepaalde foutmelding. Gebruik “try..... except” om ervoor te zorgen dat in het bestand “foutmelding_2.txt” de volgende tekst wordt opgeslagen: "Er is geen getal ingevoerd.” Gebruik “raise” om ervoor te zorgen dat de gebruiker de volgende foutmelding te zien krijgt: "Je moet een getal invoeren." Opgave 10.3 Soms veroorzaakt een bepaalde invoer geen standaard foutmelding maar wordt er iets ingevoerd wat je niet wilt. In de telefoonlijst uit de vorige les wil je bijvoorbeeld dat er alleen maar tiencijferige telefoonnummers worden ingevoerd. Vermaak het programma zo dat er een foutmelding “Onjuiste invoer.” komt als de gebruiker wat anders invoert dan een tiencijferig nummer, waarna de gebruiker opnieuw de gelegenheid krijgt om het nummer in te voeren. Je mag hiervoor if else gebruiken. Inhoudsopgave Cursus 55 Inhoudsopgave naslagwerk 10.3 Debugging Debugging is het proces van verwijderen van fouten uit een programma. Er zijn drie soorten fouten: Syntax Errors Dit zijn grammatica fouten. Je hebt dan de code niet volgens de regels opgeschreven. Als er ook maar één syntax error in je programma zit zal het niet willen draaien. Runtime Errors Dit zijn fouten die ontstaan als het programma draait. Het programma draait tot de regel met de fout en stopt dan met een foutmelding. Semantic Errors Dit zijn de moeilijkst oplosbare fouten. Het programma crashed niet maar het doet niet wat het moet doen. In Pyscripter heb je mogelijk al gemerkt dat je als je het programma runt en je komt in een oneindige lus, dan is er geen knop om het programma te stoppen. Dat lukt dan alleen via taakbeheer <CTRL><ALT><DEL> maar dat is op school geblokkeerd. Het is daarom verstandig om als je programma’s aan het testen bent het programma niet te runnen maar te debuggen. Dit gaat via het menu “Run, Debug” met sneltoets Inhoudsopgave Cursus 56 Inhoudsopgave naslagwerk <SHIFT><F9>. Als het programma dan in een oneindige lus komt kun je het stoppen met “Abort Debugging”. <CTRL><ALT><F9> Kopieer de voorbeelden die hierna komen naar het bestand “les_10” en probeer ze uit. Denk eraan dat je Debug <SHIFT><F9> doet in plaats van “Run”. Debug het volgende voorbeeld en stop het met “Abort Debugging”. Voorbeeld 2 while True: print('Klik in het run menu op Abort Debugging om deze eeuwige lus te stoppen.') 10.4 Stepping Met “stepping” kun je stap voor stap volgen wat het programma doet. Dit kun je gebruiken om fouten op te sporen. Opdracht ➢ Open het programma “dragon.py” uit de map “startbestanden”. ➢ Controleer of onderin een balk met Call Stack, Variables, Watches en Breakpoints zichtbaar is. Zo nee, maak deze zichtbaar via het menu “View, Debug Windows”. ➢ Kies in het Run menu voor “Step into”. <F7> ➢ Druk meerdere malen op <F7> en je ziet stap voor stap wat het programma doet. ➢ Zet in de onderbalk het tabblad “Variables” open. Klik nu nog een paar keer op <F7> . Je zult zien dat dit tabblad verandert. De globale en locale variabelen worden zichtbaar die vanuit het punt waar je nu bent, bereikbaar zijn. ➢ Na enige tijd op <F7> klikken kom je bij regel 40 bij de randint() functie. Omdat dit Inhoudsopgave Cursus 57 Inhoudsopgave naslagwerk een functie is van Python zelf is, is het onwaarschijnlijk dat hier een fout in zit. Dit stuk wil je dus overslaan. Dit gaat via het menu “Run, Step over” sneltoets <SHIFT><F8>. ➢ Als je al in de randint() functie of een def zit die wilt overslaan kies via het menu “Run, Step out” dan gaat hij door tot de eerstvolgende regel na de functie. ➢ Met “Abort Debugging” kun je het debuggen afbreken. <CTRL><ALT><F9> 10.5 Breakpoints Stap voor stap door het programma gaan kost veel tijd. Vaak wil je slechts een gedeelte van het programma stap voor stap onderzoeken. Dan is het handig als je het stap voor stap proces kunt beginnen vanaf een bepaalde regel. Hiervoor gebruik je breakpoints. Opdracht ➢ Open het programma “dragon.py” uit de map “startbestanden”. ➢ Maak een breakpoint op regel 42 door naast het regelnummer te klikken. Er verschijnt een rood vinkje. ➢ Debug het programma met <SHIFT><F9>. Het programma draait nu op normale snelheid en je wordt gevraagd om een cave nummer in te voeren. Doe dit en je zult zien dat het debug proces nu stopt op regel 42. Met <F7> kun je nu stap voor stap verder gaan. Je kunt meerdere breakpoints maken en je kunt ze ook allemaal in één keer wissen. Als je meerdere breakpoints hebt kun je met “Resume” <SHIFT><F9> doorspoelen naar het volgende breakpoint. ➢ Al deze commando’s zijn ook zichtbaar als pictogrammen zoals hierboven als je de Debug Toolbar zichtbaar maakt. 10.6 Opgaven blok 2 Opgave 10.4 ➢ Schrijf een programma “GEEN VIJFVOUD” dat alle kwadraten van de getallen 1 tot en met 25 print behalve de kwadraten van de getallen die deelbaar zijn door vijf. Gebruik hiervoor de modulo operator. ➢ Pas op dat je geen oneindige lus maakt zodat het programma nooit stopt. Gebruik daarom “debug” in plaats van “run”. ➢ Sla het bestand op in de map van “Python, les_10”. ➢ Tip1: Werk in kleine stappen; probeer eerst een deel van het probleem op te lossen. ➢ Tip2: Maak eerst een PSD met structorizer.. De volgende functie heb je nodig in de laatste opgave. Inhoudsopgave Cursus 58 Inhoudsopgave naslagwerk Random sample functie import random lijst = random.sample(range(1,10),4) print(lijst) Probeer bovenstaande code een paar keer uit. Steeds worden er vier willekeurige getallen onder de 10 gekozen. Opgave 10.5 ➢ Schrijf een programma dat de gebruiker vraagt om een getal onder de tien te raden. ➢ Er zijn echter drie “goede” getallen. ➢ Na maximaal zes pogingen moet de volgende melding op het scherm komen: “In … pogingen heb je … getallen goed geraden.” Op de plaats van de puntjes moeten de juiste getallen verschijnen. ➢ Heb je in bijvoorbeeld vijf beurten al alle drie de goede getallen gevonden dan moet het programma niet een zesde keer vragen om te raden. ➢ Gebruik de random.sample functie om de goede getallen te bepalen. ➢ Voorkomen moet worden dat als de gebruiker twee keer hetzelfde goede antwoord invoert dit twee keer meetelt. ➢ Sla je bestand op als “ZES_POGINGEN.py” in de map “les_10”. ➢ Tip1: Om je programma te testen is het verstandig om de random gekozen getallen te laten printen. Dan kun je beter zien in welke gevallen je programma wel of niet werkt. ➢ Tip2: Het programma lijkt veel op voorbeeld 4 uit paragraaf 7.4 over minilandjes. ➢ Tip3: Maak eerst een PSD. ➢ Tip4: Test je programma voor allerlei mogelijkheden. Inhoudsopgave Cursus 59 Inhoudsopgave naslagwerk Les 11 11.1 Object georiënteerd programmeren Encapsulation 11.2 Class Instance Object Attribute Value 11.3 Methoden Constructor self 11.4 Documentatie van de class 11.5 Opgaven 11.1 Object georiënteerd programmeren Encapsulation Naarmate de programma’s groter werden ontstond de behoefte om code te kunnen hergebruiken. Een eerste stap daartoe was het modulair programmeren. Denk aan de functies die je kunt hergebruiken. Object georiënteerd programmeren gaat nog een stap verder. Objecten zijn verzamelingen van gegevens en functies. Deze zijn gebundeld zodat je een object kunt doorgeven van het ene gedeelte van je programma naar het andere. Hierdoor krijg je niet alleen toegang tot de eigenschappen van die gegevens maar ook tot de bewerkingen die je er mee kunt doen. Dit heet encapsulation (inkapseling). Dit is de essentie van object georiënteerd programmeren. Als voorbeeld van inkapseling: een string object bevat niet alleen een tekenreeks maar bevat ook de bewerkingen (methods) die op die string kunt loslaten zoals “zoeken”, “lengte berekenen” enzovoort. 11.2 Class Instance Object Attribute Value Maak een nieuw bestand aan en sla dat op als “les_11.py”. Kopieer daar onderstaand voorbeeld in en run het. #Voorbeeld 1 Class class User: pass user1=User() user1.voor_naam = "Henk" user1.achter_naam = "Meer" print(user1.voor_naam) print(user1.achter_naam) In de eerste regel class User: wordt de class gedefinieerd. De naam van de class moet met een hoofdletter worden geschreven. De class moet minimaal één regel bevatten. Omdat we nu niets doen met de class schrijven we in de tweede regel pass . Dit doet verder niets. Nu is de class gedefinieerd. Instance en Object In de derde regel user1=User() wordt de class aangeroepen. user1 is een exemplaar (instance) van class User. Dit heet ook wel een object. Attribute en Value ➢ In de vierde regel user1.voor_naam = "Henk" worden gegevens toegevoegd aan Inhoudsopgave Cursus 60 Inhoudsopgave naslagwerk het object user1. Met behulp van een punt wordt een eigenschap (attribute) voor_naam aan het object user1 toegevoegd. De namen van de eigenschappen mogen niet met een hoofdletter beginnen en als ze uit twee woorden bestaan zet je er een underscore tussen. ➢ Een class kun je dus zien als een soort sjabloon. Een ander voorbeeld is de klasse “Auto”. Ieder exemplaar van “Auto” dat er op deze wereld is, noemen een object. Mijn auto is dus een object van de klasse “auto”. ➢ Een object heeft eigenschappen (attributes). Mijn auto heeft bijvoorbeeld een kleur, een bouwjaar enzovoort. ➢ Die eigenschappen hebben weer waarden (values). Mijn auto is bijvoorbeeld groen en is gebouwd in 2017. “groen” en “2017” zijn values. Breid de code van voorbeeld 1 uit met de volgende vier regels en voer het programma uit. voor_naam = "Ria" achter_naam = "Stoel" print(voor_naam, achter_naam) print(user1.voor_naam,user1.achter_naam) In de eerste regel wordt een variabele voor_naam = "Ria" aangemaakt die niet gekoppeld is aan een class. De naam van deze variabele voor_naam is echter gelijk aan één van de eigenschappen van object user1. Toch zijn het niet dezelfde dingen zoals uitde print opdrachten uit regel 3 en 4 blijkt. Je roept ze op verschillende manieren aan. De naam van het object zit altijd met een punt aan de naam van de eigenschap geplakt. Breid de code van voorbeeld 1 uit met de volgende vier regels en voer het programma uit. user2 =User() user2.voor_naam = "Frits" user2.achter_naam = "Boom" print(user2.voor_naam,user2.achter_naam) In de eerste regel user2 =User() wordt een nieuw object aangemaakt. Breid de code van voorbeeld 1 uit met de volgende vier regels en voer het programma uit: user1.leeftijd = 16 user2.lengte = 180 print(user1.leeftijd) print(user2.leeftijd) Als je het goed gedaan hebt krijg je een foutmelding op de laatste regel omdat user 2 geen eigenschap leeftijd heeft. Verschillende objecten van dezelfde class kunnen dus verschillende eigenschappen hebben. 11.3 Methoden Constructor self Maak de code van voorbeeld 1 inactief, kopieer de code van voorbeeld 2 eronder en run deze. Inhoudsopgave Cursus 61 Inhoudsopgave naslagwerk # Voorbeeld 2 Methoden class User: def __init__(self, volledige_naam, geboortedatum): self.naam = volledige_naam self.geboortedatum = geboortedatum user1 = User("Henk Meer", "20030422") print(user1.naam) print(user1.geboortedatum) Constructor In regel 2 def __init__(self, volledige_naam, leeftijd): wordt een methode aangemaakt voor de class User. Een methode kun je zien als een bewerking die een object van die class kan uitvoeren. De methode __init__ is een bijzondere methode. init komt van initialize (beginnen). Hij wordt aangeroepen iedere keer als je een nieuw object van deze class aanmaakt. Deze methode wordt ook wel de Constructor genoemd. self, volledige_naam, leeftijd worden de parameters (arguments) van de methode genoemd. Dit zijn de variabelen die in de methode gebruikt worden. self is een verwijzing naar het huidige object. In andere talen wordt hier ook wel het woordje this voor gebruikt. Als je een object aanroept dan roept deze de methode in de class aan met een verwijzing naar zichzelf (self). De methode gebruikt deze verwijzing om de gegevens van het huidige object op te halen. In regel 3 self.naam = volledige_naam wordt de waarde die de parameter volledige_naam krijgt opgeslagen in de eigenschap naam. In regel 4 self.leeftijd = leeftijd wordt de waarde van de parameter leeftijd opgeslagen in de eigenschap leeftijd. Let op dat het eerste woordje leeftijd een eigenschap is maar het tweede woordje leeftijd is een waarde. In regel 4 user1 = User("Henk Meer", "20030422") wordt een object user1 aangemaakt. Merk op dat er nu twee waarden moeten worden meegegeven omdat de Constructor (de __init__ methode) dit verwacht. Maak de code van voorbeeld 2 inactief, kopieer de code van voorbeeld 3 eronder en run deze. # Voorbeeld 3 Gegevens bewerking class User: def __init__(self, volledige_naam, geboortedatum): self.naam = volledige_naam self.geboortedatum = geboortedatum naam_lijst = volledige_naam.split(" ") self.voornaam = naam_lijst[0] self.achternaam =naam_lijst[-1] Inhoudsopgave Cursus 62 Inhoudsopgave naslagwerk user1 = User("Henk Meer", "20030422") print(user1.naam) print(user1.voornaam) print(user1.achternaam) print(user1.geboortedatum) ➢ Je merkt dat ondanks dat we maar twee gegevens hebben ingevoerd we er vier kunnen uit halen. ➢ In regel 5 naam_lijst = volledige_naam.split(" ") zorgt de split functie ervoor dat de volledige naam wordt gesplitst in twee stukken. De splitfunctie herkent deze stukken aan de spatie (" ") er tussen. De stukken worden opgeslagen in een lijst. ➢ In regel 6 self.voornaam = naam_lijst[0] wordt de waarde die op index 0 van de lijst staat gekoppeld aan de eigenschap voornaam van het huidige object. (self). ➢ In regel 7 wordt met de index -1 het laatste element van de lijst bedoeld. Omdat de lijst slechts twee elementen heeft had hier ook 1 mogen staan. 11.4 Documentatie van de class Het is een goede gewoonte in programmeerland om je zelf gemaakte classes goed te documenteren. Dat bespaart een hoop tijd als jij of iemand anders een jaar later de code wil begrijpen. Maak de code van voorbeeld 3 inactief, kopieer de code van voorbeeld 4 eronder en run deze. # Voorbeeld 4 Documentatie class User: """Hiermee worden de gegevens opgeslagen van alle werknemers die ooit actief zijn geweest op het netwerk.""" def __init__(self, volledige_naam, geboortedatum): self.naam = volledige_naam self.geboortedatum = geboortedatum naam_lijst = volledige_naam.split(" ") self.voornaam = naam_lijst[0] self.achternaam =naam_lijst[-1] help(User) Als je een foutmelding krijgt verbeter je het. Als het goed is haalt de helpfunctie onderaan, de informatie op, die je bovenin de class tussen driedubbele aanhalingstekens hebt gezet. Verder kun je in de helptekst de parameters zien die de class nodig heeft. In het volgende voorbeeld zullen we de class uitbreiden met een extra functie. Maak de code van voorbeeld 4 inactief, kopieer de code van voorbeeld 5 eronder en run Inhoudsopgave Cursus 63 Inhoudsopgave naslagwerk deze. import datetime class User: """Hiermee worden de gegevens opgeslagen van alle werknemers die ooit actief zijn geweest op het netwerk.""" def __init__(self, volledige_naam, geboortedatum): self.naam = volledige_naam self.geboortedatum = geboortedatum naam_lijst = volledige_naam.split(" ") self.voornaam = naam_lijst[0] self.achternaam =naam_lijst[-1] def age(self): """Geeft de leeftijd van de gebruiker in jaren.""" vandaag = datetime.date(2017,8,23) yyyy = int(self.geboortedatum[0:4]) mm = int(self.geboortedatum[4:6]) dd = int(self.geboortedatum[6:8]) gd = datetime.date(yyyy,mm,dd) # geboortedatum leeftijd_in_dagen = (vandaag-gd).days leeftijd_in_jaren = leeftijd_in_dagen/365 return int(leeftijd_in_jaren) def email(self): return '{}.{}@bedrijf.com'.format(self.voornaam, self.achternaam) def main(): user1 = User("Henk Meer", "20030422") print(user1.age()) print(user1.email()) if __name__ == '__main__': main() ➢ In de code hierboven is een methode “age” toegevoegd om de leeftijd van de gebruiker te berekenen. ➢ Omdat hiervoor alleen de geboortedatum nodig is, hebben we behalve self geen andere parameters nodig. De huidige datum is namelijk al in de code gegeven. Daardoor krijgt iedereen dezelfde uitkomst: 14. ➢ In regel 1 import datetime wordt de datetime module geïmporteerd. ➢ Regel 3 van de age methode vandaag = datetime.date(2017,8,23) zegt dat het vandaag 23 augustus 2017 is. ➢ Regel 4 van de age methode yyyy = int(self.geboortedatum[0:4]) haalt het jaartal uit de geboortedatum; dit zijn de cijfers op de indices 0 tm 3. ➢ Regel 8 van de age methode leeftijd_in_dagen = (vandaag-gd).days berekent met behulp van de methode days uit de module datetime het aantal dagen tussen de geboortedatum en 23 augustus 2017. ➢ In de methode email(self) zien we een krachtige manier om iets netjes op het Inhoudsopgave Cursus 64 Inhoudsopgave naslagwerk scherm te krijgen. De acculaden {} stellen de parameters voor uit de string.format() functie. Vergeet de punt tussen de string en de functie niet. ➢ Let op dat het hoofdprogramma main() tegen de kantlijn staat want het behoort niet tot de class User(). ➢ Merk op dat in de op één na laatste regel print(user1.age()) dat hoewel er geen parameter tussen de haakjes staat, er wel degelijk eentje is namelijk “self”. In de methode def age(self) moet hij wel opgeschreven worden. ➢ Voeg de volgende code aan voorbeeld 5 toe help(User) en run het programma. Als het goed is krijg je nu ook de omschrijving van de age methode te zien. Als je een foutmelding krijgt moet je de engine aanpassen naar “Remote(Tk)” vie het menu “Run, Python engine”. 11.5 Opgaven Opgave 11.1 In deze opgave gaan we een veel gemaakte fout expres maken. Verander in voorbeeld 5 age(self) in age() en bekijk wat voor een foutmelding je krijgt. Uit de regel print(user1.age()) zou je misschien kunnen denken dat age() geen parameters (arguments) heeft maar de methode heeft wel degelijk een parameter “self”. Opgave 11.2 a) Zet deze opgave onder de voorbeelden in het bestand “les_11”. b) Maak een class Werknemer met de eigenschappen voornaam, achternaam en salaris. c) Maak een methode volledige_naam die de voornaam en achternaam achter elkaar plakt. d) Maak twee werknemers aan. e) Zorg dat de volledige naam van de tweede werknemer netjes op het scherm komt, dus zonder aanhalingstekens, kommas of haakjes. Opgave 11.3 a) Als opgave 11.2 gelukt is, kopieer deze dan naar opgave 11.3. b) Zorg dat je de voornaam, achternaam en salaris van één werknemer via het scherm kunt invoeren. Dit mag gewoon in het hoofdprogramma main() c) Zorg dat de volledige naam van de werknemer netjes op het scherm komt, dus zonder aanhalingstekens, kommas of haakjes. Opgave 11.4 a) Als opgave 11.3 gelukt is, kopieer deze dan naar opgave 11.4. b) Zorg dat je de voornaam, achternaam en salaris van meerdere werknemers via het scherm kunt invoeren. Tip: Gebruik een lijst in een lijst. c) Zorg dat een lijst met de volledige naam van iedere ingevoerde werknemer netjes onder elkaar op het scherm komt, dus zonder aanhalingstekens, kommas of haakjes. Inhoudsopgave Cursus 65 Inhoudsopgave naslagwerk Les 12 12.1 Overerving (Inheritance) 12.2 Maintainable software 12.3 Opgaven 12.1 Overerving (Inheritance) Klassen kunnen subklassen hebben die de eigenschappen van hun ouders erven. Open uit de map startbestanden het bestand les_12_start en sla dit op als “les_12.py” bij je andere bestanden van deze cursus. Run de de code van voorbeeld 1 (zie hieronder). # Voorbeeld 1 class Werknemer: opslag = 1.04 def __init__(self, voornaam, achternaam, salaris): self.voornaam = voornaam self.achternaam = achternaam self.salaris = salaris def volledige_naam(self): return '{} {}'.format(self.voornaam, self.achternaam) def opslag_toepassen(self): self.salaris = int(self.salaris * self.opslag) class Programmeur(Werknemer): opslag = 1.10 def main(): werknemer1 = Werknemer('Karel','Kleuter', 4000) werknemer2 = Programmeur('Frida','Frats', 5000) werknemer1.opslag_toepassen() werknemer2.opslag_toepassen() print(werknemer1.salaris) print(werknemer2.salaris) if __name__ == '__main__': Inhoudsopgave Cursus 66 Inhoudsopgave naslagwerk main() In bovenstaand programma krijgt een gewone werknemer een opslag van 4% (1.04) en een programmeur krijgt 10% (1.10). In het hoofdprogramma wordt de methode opslag_toepassen() toegepast. Werknemer2 is een programmeur. De klasse Programmeur(Werknemer) heeft zelf geen methode opslag_toepassen() maar erft deze van de klasse Werknemer. Maak de code van voorbeeld 1 inactief en run de code van voorbeeld 2 (zie hieronder). # Voorbeeld 2 class Werknemer: opslag = 1.04 def __init__(self, voornaam, achternaam, salaris): self.voornaam = voornaam self.achternaam = achternaam self.salaris = salaris def volledige_naam(self): return '{} {}'.format(self.voornaam, self.achternaam) def opslag_toepassen(self): self.salaris = int(self.salaris * self.opslag) class Programmeur(Werknemer): opslag = 1.10 def __init__(self, voornaam, achternaam, salaris, prog_taal): super().__init__(voornaam,achternaam,salaris) self.prog_taal = prog_taal In de eerste gele regel is een __init__ functie gegeven waardoor bij een programmeur ook de eigenschap programmeertaal kan worden opgegeven. De tweede gele regel gebruikt de methode super() waarmee hij de superclass Werknemer de eigenschappen voornaam, achternaam en salaris laat afhandelen. Op deze manier staat er geen dubbele code in het script. Inhoudsopgave Cursus 67 Inhoudsopgave naslagwerk class Manager(Werknemer): def __init__(self, voornaam, achternaam, salaris, werknemers=None): super().__init__(voornaam,achternaam,salaris) if werknemers is None: self.werknemers = [] else: self.werknemers = werknemers In de eerste gele regel van subclass Manager staat werknemers=None. Dit is een manier om op te schrijven dat een lijst of dictonary leeg is. In de vierde gele regel wordt een lege lijst aangemaakt als een manager geen werknemers managed. Als hij dat wel doet komen alleen de werknemers die door hem gemanaged worden in de lijjst. def voeg_toe_werkn(self,werkn): if werkn not in self.werknemers: self.werknemers.append(werkn) Met de methode hierboven kunnen werknemers aan een manager worden toegevoegd. def verwijder_werkn(self,werkn): if werkn in self.werknemers: self.werknemers.remove(werkn) Met de methode hierboven kunnen werknemers van een manager worden verwijderd. def verwijder_werkn(self,werkn): def print_werkn(self): for werkn in self.werknemers: print('-->',werkn.volledige_naam()) def main(): werknemer1 = Programmeur('Karel','Kleuter', 4000, 'Python') werknemer2 = Programmeur('Frida','Frats', 5000, 'Java') manager1 = Manager('Menno','Mak',9000,[werknemer1]) print(werknemer2.prog_taal) print(manager1.volledige_naam()) Inhoudsopgave Cursus 68 Inhoudsopgave naslagwerk print(manager1.print_werkn()) manager1.voeg_toe_werkn(werknemer2) print(manager1.print_werkn()) manager1.verwijder_werkn(werknemer1) print(manager1.print_werkn()) if __name__ == '__main__': main() 12.2 Maintainable software Onder maintainable software verstaan we software die makkelijk te onderhouden en makkelijk aanpasbaar is. Hieronder staan vuistregels om beter leesbare code te krijgen. Vuistregels 1. Maak je eenheden in je code niet langer dan 15 regels. Zijn ze langer, splits ze dan op. 2. Kies je namen van je variabelen en functies zo dat commentaarregels overbodig zijn. 3. Gebruik niet meer dan 4 splitsingen per eenheid. Bij splitsingen kan het programma meerdere richtingen op. Ze treden bijvoorbeeld of bij if, while, for, and, or. 4. Zorg dat een stukje code slechts één keer voorkomt in je programma. Gebruik methodes of classes die je kunt aanroepen. Als er een fout in de code zit, dan staat hij slechts op één plaats. 5. Gebruik niet meer dan 4 parameters per constructor of methode. Maak hiervoor zonodig extra classes aan. Met meer parameters maak je makkelijk vergissingen. 6. Maak de totale hoeveelheid code zo kort mogelijk. 7. Stop geen functies in je programma die toch niet of nauwelijks gebruikt gaan worden. 8. Gebruik waar mogelijk klassen en modules uit bestaande bibliotheken. 9. Splits zo nodig je systeem op in kleinere onafhankelijke systemen. 12.3 Opgaven Opgave 12.1 Voeg onderaan voorbeeld 2 help(Manager) toe en run het programma. Je kunt nu zien welke methoden en variabelen deze class erft van de superclass Werknemer. Opgave 12.2 a) Maak een klasse “Huisdier”. b) Geef deze klasse als documentatie:”Dit zijn de eigenschappen van de huisdieren bij Inhoudsopgave Cursus 69 Inhoudsopgave naslagwerk mij thuis.” c) Definieer voor deze klasse de variabele voedselfactor en geef deze de waarde 20. d) Ieder huisdier heeft een naam, gewicht en kleur. e) Maak een functie die de hoeveelheid eten uitrekent dat het dier per dag krijgt in kg. Dit gaat met de formule eten = gewicht/voedselfactor. f) Maak een subklasse “Hond”. g) Voor honden is de voedselfactor 10. h) Maak twee dieren aan waarvan er eentje een hond is. i) Print van beide dieren de kleur en de hoeveelheid eten die ze per dag moeten hebben. Inhoudsopgave Cursus 70 Inhoudsopgave naslagwerk Naslagwerk Python Inhoudsopgave naslagwerk 1 Documentatie 2 Programmeertechnieken 3 Commentaar 4 Escapeteken \ 5 Variabelen 6 Gegevenssoorten 7 Operatoren 8 Vertakkingen 9 Lussen 10 Functies 11 Modules Inhoudsopgave Cursus 71 Inhoudsopgave naslagwerk 1 Documentatie Naslagwerken De officiële documentatie voor Python 3 staat op: https://docs.python.org/3.2/ ➔ Wanneer je hier op "Library Reference" klikt en kun je bij alle built in functies komen. ➔ Via Global Module Index kun je bij een heleboel modules komen. ➔ Dezelfde documentatie is te bereiken via het menu “Help”, “Python manuals”. Een overzichtelijk naslagwerk staat op: http://openbookproject.net/thinkcs/python/english3e/ Voor wie verder wil: een uitgebreide en makkelijk leesbare cursus python staat op: http://www.alan-g.me.uk/l2p/index.htm geschreven voor python 3. Python 2 en Python 3 Doordat Python een vrij jonge taal is; ze is pas begin jaren 90 ontstaan, verandert ze nog voortdurend. De laatste belangrijke overstap was van Python 2 naar Python 3. Omdat er nog veel code op het internet te vinden is die in Python 2 geschreven is, doe je er goed aan de verschillen te bestuderen. Een samenvatting hiervan vind je op: http://www.cmi.ac.in/~madhavan/courses/prog2-2012/docs/diveintopython3/porting-codeto-python-3-with-2to3.html De code die in python 2 is gemaakt is niet op eens waardeloos geworden maar kan vrij gemakkelijk omgezet worden. 2 Programmeertechnieken Syntax errors oplossen (grammatica fouten) 1. In de foutmelding staat altijd het regelnummer. Meestal bevindt de fout zich in de regel zelf of de regel erboven. 2. Wanneer in de foutmelding Engelse woorden voorkomen die je niet kent haal je die door de vertaalmachine. 3. Wanneer in de foutmelding iets van string of integer voorkomt is het meestal een notatiefout. 4. Wanneer in de foutmelding “indent” voorkomt dan heeft het met inspringende code te maken. Python dwingt je alles netjes te noteren. 5. Bij kopiëren en plakken kunnen de aanhalingstekens soms niet goed doorkomen. 6. Zorg dat de eerste regel van een if, while, for of def opdracht eindigt met een dubbele punt : 7. Tel je haakjes, er moeten er evenveel naar links als naar rechts staan. 8. Heb je == gebruikt in plaats van = bij een voorwaarde. 9. Gebruik voor je variabelenamen geen woorden zoals “true” en “int” die al in de pythontaal voorkomen. Inhoudsopgave Cursus 72 Inhoudsopgave naslagwerk 10. Als bovenstaande niet werkt, breng dan in het begin van de code een nieuwe fout in en kijk of die een foutmelding geeft. Is dat niet het geval dan is er iets mis met je programmeer omgeving. Maak dan een nieuw bestand aan en stop er simpele code in zoals een print opdracht of kopieer code van een simpel programma dat eerder gewerkt heeft en kijk of het werkt. Als dat het geval is breng stukje bij beetje code over van je oude bestand naar je nieuw bestand run het. Testen van code die geen foutmeldingen meer geeft 1. Als de code lijkt te werken moet je allerlei invoergegevens uitproberen om te kijken of iedere vertakking van het programma werkt Goed testen is net zo belangrijk als goed coderen. Als het programma wat anders doet dan wat het moet doen, doe dan onderstaande. 2. Print testvariabelen uit om te zien wat de code doet. 3. Debug het programma in plaats van Run. Zo kun je stap voor stap door het programma lopen. Zie hoofdstuk 10 Stepping. 4. Als het programma helemaal niets doet controleer dan of er wel een print opdracht in zit en of je misschien een functie op de verkeerde manier aanroept. 5. Als het programma hangt kan het zijn dat je per ongeluk een oneindige lus hebt gemaakt. Om dit te testen plaats je een print opdracht voor de lus en een tweede in de lus. Als de eerste print opdracht wel uitgevoerd wordt en de twee niet of heel veel keer dan heb je een oneindige lus. Controleer dan of er een voorwaarde in de lus zit die hem moet stoppen. Als je de ontwerpfout niet ziet laat je variabelen dan uitprinten in het begin van de lus. Zo kun je op een idee komen waar de fout zit. Testen van code die andere soorten foutmeldingen geeft 1. NameError Je roept een variabele aan die niet bestaat. Dit kan een typefout zijn maar het kan ook zijn dat je lokale variabele aanroept die globaal had moeten zijn. Zie 9.4 Scope. 2. TypeError Dit kan verschillende oorzaken hebben. Bijvoorbeeld je gebruikt een string waar het een integer had moeten zijn. Het aantal items bij iets wat je doet klopt niet. 3. AttributeError Je roept een eigenschap of methode op die niet bestaat. 4. IndexError De index in een lus wordt groter dan de lengte van een lijst minus 1. Wat je nog meer kunt doen 1. Maak je code overzichtelijk door code die niets doet, te verwijderen. 2. Maak het probleem kleiner en probeer dat eerst op te lossen. 3. Kopieer het deel van het programma wat niet werkt naar een ander bestand, geef het wat input en probeer het te laten werken. 4. Maak een PSD. Is je ontwerp wel goed? 5. Slaap er een nachtje over. 6. Laat iemand anders eens naar de code kijken. 7. Als je de fout gevonden hebt, bedenk dan wat je had moeten doen om de fout sneller te vinden. Zo wordt je een steeds betere programmeur. Inhoudsopgave Cursus 73 Inhoudsopgave naslagwerk 3 Commentaar Commentaarregels beginnen met # bijvoorbeeld: # De volgende code bevat het hoofdprogramma. Commentaar regels worden niet uitgevoerd. Ze worden gebruikt om de code te verduidelijken of om code tijdelijk uit te schakelen voor het testen. Meerdere regels Wanneer je een tekst van meerdere regels op het scherm wil krijgen waarbij je de opmaak wil behouden gebruik je in python driedubbele aanhalingstekens. Typ en run: # Voorbeelden les 4 # Meerdere regels print('''Met driedubbele aanhalingstekens kun je een zin over meer regels spreiden''') 4 Escapeteken \ Soms staan er tekens in een zin die je niet zonder meer letterlijk kunt typen. Dit zijn bijvoorbeeld de dubbele aanhalingstekens zelf. print("Hij zei: \"Wat een onzin\".") Merk op dat door de schuine strepen (backslash) de dubbele aanhalingstekens geprint worden. De backslash zorgt ervoor dat ze letterlijk geprint worden en ziet ze niet meer als onderdeel van de code maar als een stukje tekst. De backslash wordt ook wel het escape teken genoemd. Hij wordt onder andere gebruikt om code van hackers onschadelijk te maken. In andere programmeertalen kan het ook een ander teken zijn dan de backslash. 5 Variabelen Variabelen Een variabele kun je zien als een leeg doosje waar je iedere keer wat anders in kunt stoppen. Variabelenamen Het is een goede gewoonte om variabelenamen te laten beginnen met een kleine letter en ieder heel woord in de variabele naam met een hoofdletter te laten beginnen. Bijvoorbeeld: eenZeerLangeVariabeleNaam Inhoudsopgave Cursus 74 Inhoudsopgave naslagwerk 6 Gegevenssoorten Datatype is het Engelse woord voor gegevenssoort. 6.1 Integers 6.2 Strings 6.3 Floats 6.4 Lijsten 6.1 Integers Integers zijn gehele getallen waarmee je kunt rekenen. Zo sla je een integer in een variabele op: a=4 6.2 Strings Strings zijn tekenreeksen. Hiermee kun je niet rekenen. Zo sla je een string in een variabele op: a = “rt@#123P” Je kunt delen van strings uit een sstring halen op de volgende manier mijnString = 'Versleten' print(mijnString[1:6]) print('nietbest'[3:4]) Geeft: ersle t Let hierbij op dat de getallen de indexen voorstellen net als bij lijsten. De index van het eerste teken is 0. Merk verder op dat 1:6 betekent 1 tot 6. Index 6 wordt niet meegerekend. Vandaar dat de “t” van “Versleten” niet wordt geprint. De lengte van de substring is daardoor 6-1=5. 6.3 Floats Floats zijn getallen met een zwevende punt erin. Ze worden ook wel reals of doubles genoemd. Zo sla je een float in een variabele op: a = 5.2 6.4 Lijsten 6.4.1 Lijsten 6.4.2 Index 6.4.3 Toevoegen, verwijderen en samenvoegen 6.4.4 Lijst in een lijst 6.4.5 Snel vullen, index uitlezen en lengte van de lijst bepalen 6.4.6 Lijst functies 6.4.1 Lijsten Een variabele is een leeg doosje waar je precies één ding in kunt doen. Een lijst kun je vergelijken met een leeg doosje met meer vakjes. Je definieert ze door rechte haken te gebruiken. Inhoudsopgave Cursus 75 Inhoudsopgave naslagwerk Typ en run: # Voorbeeld 1 lijsten eenLegeLijst = [] eenAndereLijst = [1,2,3] print (eenAndereLijst) 6.4.2 Index De inhoud van de lijst kunnen we bereiken met behulp van een zogenaamde index. Deze geeft de positie in de lijst aan. Het eerste element van de lijst heeft index 0, het tweede 1 enzovoort. Typ en run: # Voorbeeld 2 index eenLijst = [5,66,"zon",'maan','ster'] print(eenLijst) # print de hele lijst print(eenLijst[0]) # print index 0, dat is 5 print(eenLijst[2]) # print index 2, dat is zon print(eenLijst[-1]) # bij een negatieve index wordt vanaf achteren geteld Wanneer je de inhoud van de lijst wilt veranderen gebruik je de index. Typ en run: # Voorbeeld 3 lijst aanpassen getalLijst = [14,16,18] print(getalLijst) getalLijst[2] = 32 print(getalLijst) Als het goed is print hij als laatste regel: [14, 16, 32] 6.4.3 Toevoegen, verwijderen en samenvoegen Met de functie append() kun je iets aan een lijst toevoegen. Typ en run: # Voorbeeld 4 Iets aan een lijst toevoegen lijst = [7,8,9] lijst.append(13) print(lijst) Als het goed is print hij als laatste regel: [7, 8, 9, 13] Met het commando del kun je iets uit een lijst verwijderen. Typ en run: # Voorbeeld 5 Iets uit een lijst verwijderen lijst3 = [5,6,7,8] del lijst3[2] print(lijst3) Inhoudsopgave Cursus 76 Inhoudsopgave naslagwerk Als het goed is print hij als laatste regel: [5, 6, 8] Met het + teken kun je twee lijsten samenvoegen. Typ en run: # voorbeeld 6 Twee lijsten samenvoegen lijst4 = [11,12,13] lijst5 = [28,33,45,67] nieuweLijst = lijst4 + lijst5 print(nieuweLijst) Als het goed is print hij als laatste regel: [11, 12, 13, 28, 33, 45, 67] 6.4.4 Lijst in een lijst Typ en run: # Voorbeeld 7 Lijst in een lijst lijst1 = [38,40,42] lijst2 = [3] lijst2.append(lijst1) print(lijst2) Als het goed is print hij als laatste regel: [3, [38, 40, 42]] Het eerste element van de lijst is 3 maar het tweede element is zelf ook weer een lijst. Door een dubbele index te gebruiken kunnen we elementen uit zo'n lijst in een lijst ophalen. Voeg de volgende regel toe aan de vorige code en run: print(lijst2 [1][2]) Als het goed is print hij als laatste regel: 42 De eerste index 1 geeft aan dat het om het tweede element gaat immers de telling begint bij nul. De tweede index 2 geeft aan dat het om het derde element van dit tweede element gaat. Het nesten van lijsten in lijsten is bijzonder nuttig. Je kunt er bijvoorbeeld een adresboek mee maken. Voorbeeld: adresboek = [ [ “Karel”,”Jansen”, “4302KK”, “Lutjebroek”], [“Hans”, “Worst”, “2211QQ”, “Bommerdam”, ….........] 6.4.5 Snel vullen, index uitlezen en lengte van de lijst bepalen Een lijst snel vullen met dezelfde elementen gaat met behulp van het vermenigvuldigingsteken *. Dit heb je bijvoorbeeld nodig als alle elementen in een lijst een bepaalde beginwaarde moeten hebben. Typ en run: # Voorbeeld 8 Een lijst snel vullen nulLijst = [6]*10 Inhoudsopgave Cursus 77 Inhoudsopgave naslagwerk print(nulLijst) Als het goed is print hij als laatste regel: [6, 6, 6, 6, 6, 6, 6, 6, 6, 6] De index van een bepaald element in een lijst vinden gaat met de index() functie. Typ en run: # Voorbeeld 9 De index van een element vinden print([3,5,7,9].index(5)) Als het goed is komt hier 1 uit want het element 5 bevindt zich op positie 1. Om de lengte van een lijst te bepalen gebruiken we de functie len(). Typ en run: # Voorbeeld 10 De lengte van een lijst bepalen langLijst = [1,2,5,6,6,8,9] print(len(langLijst)) Als het goed is komt hier 7 uit. 6.4.6 Lijst functies Hieronder staan een aantal veelgebruikte functies bij lijsten. lijst.append(A) voegt A toe aan het einde van “lijst”. lijst.insert(i, A) voegt A toe bij index i van “lijst”. lijst.extend(L) voegt een lijst L toe aan “lijst”. lijst.remove(A) verwijderd het eerste object “A” uit “lijst”. lijst.pop(i) verwijdert lijst(i) en geeft lijst(i) als waarde. lijst.pop() verwijdert en geeft het laatste item van”lijst” als waarde. lijst.reverse() draait de lijst om. lijst.sort() sorteert de lijst. lijst.index(A) geeft de index terug van de positie waar object “A” gevonden is. Als object “A” meerdere malen voorkomt geeft hij de kleinste index terug. Als “A” niet voorkomt krijg je een “ValueError”; zie Errorhandling. lijst.count(A) geeft het aantal keren dat object “A” in een lijst voorkomt. lijst = list(‘python’) maakt van een string een lijst ['p', 'y', 't', 'h', 'o', 'n'] 7 Operatoren Rekenkundige operatoren Volgorde van bewerkingen Vergelijkings operatoren Logische operatoren Rekenkundige operatoren Hier volgt een overzicht: + voor optellen – voor aftrekken * voor vermenigvuldigen Inhoudsopgave Cursus 78 Inhoudsopgave naslagwerk / voor delen ** voor machtsverheffen bijvoorbeeld 2**3 = 2*2*2 = 8 % voor modulus of modulo; dit is de rest van een deling. Bijvoorbeeld 7%3 geeft 1 want 7 gedeeld door 3 is 2 met rest 1. Volgorde van bewerkingen De rekenvolgorde zoals je die bij het vak rekenen hebt gehad geldt hier ook: 1. Haakjes gaan voor alles. 2. ** 3. *, /, % 4. +, – Vergelijkings operatoren Operator voorbeeld A == B A != B A>B A<B A >= B A <= B A IN B A NOT IN B Omschrijving Waar als A gelijk is aan B Waar als A niet gelijk is aan B. Waar als A groter is dan B Waar als A kleiner is dan B. Waar als A groter of gelijk aan B is. Waar als A kleiner of gelijk aan B is. Waar als A behoort tot de verzameling B Waar als A niet behoort tot de verzameling B Verschil python 2 en 3: in python 2 mocht je in plaats van != ook <> gebruiken. In python 3 mag dit niet meer. In if elif else opdrachten worden vaak logische operatoren gebruikt. Deze kijken of een bewering waar of niet waar is. Let op dat als twee dingen aan elkaar gelijk moeten zijn het dubbele == teken wordt gebruikt. Logische operatoren Deze worden ook wel booleaanse operatoren genoemd. Operator Omschrijving Effect Voorbeeld A and B en Waar als A en B beiden waar zijn. Niet waar in alle andere gevallen. A or B of Waar als of A of B of beiden waar zijn. Niet waar als A en B beiden niet waar zijn. not B Ontkenning Waar als B niet waar is. Het volgende programma controleert of twee wachtwoorden aan elkaar gelijk zijn: Typ, run en probeer alle mogelijkheden uit: # wachtwoorden wachtwoord1 = input("Voer een wachtwoord in:") Inhoudsopgave Cursus 79 Inhoudsopgave naslagwerk wachtwoord2 = input("Voer het wachtwoord nogmaals in:") if wachtwoord1 == wachtwoord2: print("De wachtwoorden zijn aan elkaar gelijk.") else: print("De wachtwoorden zijn niet aan elkaar gelijk") Het volgende programma print een boodschap uit als beide ingevoerde getallen groter dan 5 zijn. Als dat niet het geval is, gebeurt er niets. Typ, run en probeer alle mogelijkheden uit: # aan beide voorwaarden is voldaan a = int(input("Noem een getal onder de 10:")) b = int(input("Noem een ander getal onder de 10:")) if a > 5 and b > 5: print("Beide getallen zijn groter dan 5.") Het volgende programma print een boodschap uit als één of meer ingevoerde getallen groter dan 5 zijn. Verder wordt de optelsom van beide getallen geprint. Als dat niet het geval is, gebeurt er niets. Typ, run en probeer alle mogelijkheden uit. De tabs zul je opnieuw in moet stellen. # aan één van de voorwaarden is voldaan a = int(input("Noem een getal onder de 10:")) b = int(input("Noem een ander getal onder de 10:")) if a > 5 or b > 5: c = a+b print("Eén of meer getallen zijn groter dan 5.") print(c) #not operator voornaam = input("Noem je voornaam: ") if not voornaam: print("Je bent vergeten om iets in te vullen.") else: print("Dank je wel.") 8 Vertakkingen If else If elif else if in if opdracht If else Het volgende programma vraagt de gebruiker om zijn voornaam. #waar of niet waar voornaam = input("Noem je voornaam: ") if voornaam: Inhoudsopgave Cursus 80 Inhoudsopgave naslagwerk print("Dank je wel.") else: print("Je bent vergeten om iets in te vullen.") De regel “if voornaam” betekent: “Bestaat de variabele voornaam.” Als er iets ingevuld is dan is het antwoord op deze vraag “Ja”. De bewering is dan waar (engels: true). Is er niets ingevuld dan is het antwoord op deze vraag “Nee” en is de bewering niet waar (engels: false). Het “else” gedeelte mag je weglaten als er niets hoeft te gebeuren als niet aan de voorwaarde is voldaan. Let op de dubbele punt achter if en else. If elif else Het komt vaak voor dat er meer dan twee mogelijkheden zijn. Dan breid je de if else opdracht uit tot if elif else. Er mogen zoveel elif regels tussen staan als je maar wilt. In het volgende programma zijn er vier categorieën van getallen. Merk verder op dat in de ifopdracht er meer dan één logische operator wordt gebruikt. elif en else mogen ook weggelaten worden als er geen opdracht hoeft te worden uitgevoerd. Typ en run: # Prijzen prijs = int(input("Kies een geheel getal onder de tien voor je prijs:")) if prijs == 1 or prijs == 4 or prijs == 9: print("Je hebt een cadeaubon gewonnen.") elif prijs == 2: print("Je hebt een reis naar Ameland gewonnen.") elif prijs == 7: print("Je hebt een auto gewonnen.") else: print("Je hebt helaas geen prijs.") if in if opdracht Het is ook mogelijk om binnen een if opdracht een andere if opdracht te nesten. Op dat moment worden de inspringen erg belangrijk zodat je weet wat bij wat hoort. In onderstaand voorbeeld wordt aan mensen die “Piet” heten en ouder dan twaalf jaar zijn een extra vraag gesteld. Typ, run en probeer alle mogelijkheden uit. Wanneer je kopieert en plakt moet je de aanhalingstekens en de inspringingen opnieuw doen. # If in een if opdracht voornaam = input("Wat is je voornaam:") if voornaam == "Piet": leeftijd = int(input("Wat is je leeftijd:")) if leeftijd > 12: achternaam = input("Wat is je achternaam:") Inhoudsopgave Cursus 81 Inhoudsopgave naslagwerk print("Jij heet " + voornaam + " " + achternaam + " en je bent " + str(leeftijd) + " jaar.") else: print("Je hebt niet de leeftijd die we zoeken.") else: print("Je bent niet degene die we zoeken.") 9 Lussen 9.1 For-lus 9.2 While lus 9.3 Eeuwige lus 9.5 range(start,stop,stapgrootte) 9.4 Lus in een lus 9.6 Gebruik van de index in een lus Lussen in een programma worden ook wel iteraties of herhalingen genoemd. De twee belangrijkste zijn de while-lus en de for-lus. De for lus wordt veel gebruikt om een bepaalde reeks af te lopen. De while lus gebruik je als er een voorwaarde gesteld moet worden om de lus te laten stoppen. 9.1 For-lus Met het volgende opdrachten kun je een reeks uitprinten die in een variabele of lijst zit. Probeer het maar uit. Typ en run: # Voorbeeld 12 For-lus for x in 'Python': print ('Dit is de letter: ' + x) De for lus loopt hier alle tekens van het woord 'Python' af en print ze regel voor regel uit. Typ en run: # Voorbeeld 13 For-lus en lijst fruitlijst = ['banaan', 'appel', 'mango'] for fruit in fruitlijst: print ('We hebben een : ' + fruit) De for lus loopt hier een hele lijst af en print de inhoud van die lijst regel voor regel uit. 9.2 While lus Een while lus is een ander type lus. Je kunt er meer mee maar hij is iets lastiger in gebruik. Het volgende programma laat de gebruiker een getal onder de tien raden net zolang tot de gebruiker het raadt. Typ, run en test dit programma: # Voorbeeld 4 While lus import random getal = random.randint(1,9) print(getal) raad = 0 while raad != getal: raad = int(input("Noem een getal onder de 10")) print("Goed geraden") Inhoudsopgave Cursus 82 Inhoudsopgave naslagwerk ➔ De derde regel gebruikt de functie randint waarbij je een geheel getal kiest dat minimaal 1 en maximaal 9 is. ➔ De regel print(getal) is voor testdoeleinden zodat je niet eindeloos hoeft te raden. ➔ De regel raad = 0 is nodig omdat anders het programma de variabele “raad” niet kent bij het begin van de while lus. Dit heet een variabele declareren. ➔ De regel while raad != getal: betekent: Zolang de variabele “raad” niet gelijk is aan de variable “getal”. ➔ In de regel daaronder staat de opdracht die uitgevoerd wordt zolang het getal niet geraden is. ➔ Zo gauw het getal geraden is springt het programma uit de lus en voert de laatste regel van het programma uit. 9.3 Eeuwige lus Bij lussen bestaat altijd het gevaar dat je in een zogenaamde eeuwige lus terecht komt. Het programma blijft dan maar doorgaan en stopt niet uit zichzelf. De oorzaak is dat aan de voorwaarde waardoor de lus stopt nooit wordt voldaan. De oplossing is om de applicatie waarin het programma draait af te sluiten. In windows doe je dit door op <CTR><ALT><DEL> te drukken. Hierdoor kun je taakbeheer openen en bij tabblad “toepassingen” het programma afsluiten. Typ, run en gebruik taakbeheer of klik op het kruisje van het programma om het af te sluiten: # Voorbeeld 5 Eeuwige lus a = 10 while a != 6: a=a+1 print(a) In het programma hierboven blijft a altijd ongelijk aan 6 en zal de lus dus door blijven gaan. 9.4 Lus in een lus Wanneer de opdrachten wat ingewikkelder worden moet een programmeur al gauw zijn toevlucht nemen tot een lus in een lus. Het volgende programma berekent alle veelvouden van 12 die tevens veelvoud van 15 zijn tussen 0 en 500. Je ziet dat in de binnenste lus ook nog een if opdracht zit. Let op de inspringingen. Typ en run: # Voorbeeld 6 Een lus in een lus for a in range(0,500,12): for b in range(0,500,15): if a == b and a != 0: print(a) Als je foutmeldingen krijgt met “indentation” staan de inspringingen niet goed. Dit gebeurt vooral als je kopieert en plakt. Inhoudsopgave Cursus 83 Inhoudsopgave naslagwerk 9.5 range(start,stop,stapgrootte) In combinatie met een for-lus wordt de functie range veel gebruikt. Het volgende programma print het getal 26, dan drie minder dus 23, dan 20 enzovoort totdat de teller gelijk aan 14 wordt. Dan springt hij uit de lus en stopt het programma. Typ en run: # Voorbeeld 14 range for teller in range(26,14,-3): print(teller) 9.6 Gebruik van de index in een lus In het volgende programma wordt gebruik gemaakt van de index. Let op dat de eerste index altijd 0 is. Dus index = 0 hoort bij 'banaan'. De len() functie is hier gebruikt om de lengte van de lijst te bepalen. Voor onderstaand voorbeeld is de lengte van de lijst dus 3. Zo gauw de index 3 wordt stopt de for lus. Typ en run: # Voorbeeld 15 Gebruik van de index fruitlijst = ['banaan', 'appel', 'mango'] for index in range(len(fruitlijst)): print ('Dit soort fruit heet: ' + fruitlijst[index]) 10 Functies Functies vinden Functies in deze cursus float(string) input([prompt]) int() len(s) print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) round(object, decimalen) str(object) Functies vinden Python 3 kent een groot aantal ingebouwde functies. Dat aantal kun je nog uitbreiden door bepaalde bibliotheken te importeren. Dat laatste is in python niet moeilijk. je kunt de ingebouwde functies vinden door in een zoekmachine “python 3 functions built in” te typen of door naar het volgende internetadres te gaan: docs.python.org/3/library/functions.html Wanneer je veel functies kent in een taal kun je kortere programma's schrijven. Functies in deze cursus float(string) Maakt van een string een float dus een kommagetal waarmee je kunt rekenen. input([prompt]) Met deze functie kun je gegevens invoeren. De prompt geeft aan dat de functie op invoer wacht. De gegevens worden opgeslagen in bijvoorbeeld een variabele. Inhoudsopgave Cursus 84 Inhoudsopgave naslagwerk Voorbeeld: a = input("Voer je naam in:") print(a) int() Met deze functie kun je van een string of float een integer maken dus een geheel getal. Voorbeeld: a=3.6 b=int(a) print("De uitkomst is",b) Geeft b = 3. len(s) Met de functie len() kun je het aantal tekens in een string bepalen. voorbeeld: a="krokodil" b=len(a) print(b) Op het scherm komt: 8 print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) Deze functie kan dingen wegschrijven. Binnen de haakjes vind je een aantal parameters: objects, sep, end, file en flush. *objects Door haakjes gescheiden kunnen dit meerdere variabelen, strings, integers, en andere gegevenstypen zijn. Voorbeeld: a=3 print(a,"voet",24) geeft: 3 voet 24 sep komt van separator = scheidingsteken; dit is standdaard de spatie. Voorbeeld: print(2,3,4,sep='|') geeft 2|3|4 end is wat er na de opdracht moet gebeuren. Standaard staat deze op \n wat nieuwe regel betekent. file is het bestand waar hij naar schrijft. Dit is standdaard “sys.stdout”; alles wat hierin komt gaat naar het scherm. Je kan echter ook naar bijvoorbeeld voorbeeld.txt schrijven. flush Wanneer je byte voor byte iets naar een bestand wegschrijft kost dat veel tijd. Dit gebeurd bij Flush=true. Om de performance te verbeteren worden de gegevens vaak in een tijdelijke buffer weggeschreven. Pas als er voldoende gegevens zijn wordt het in één keer als één groot blok weggeschreven naar het bestand. Dit verbetert de performance. Standaard wordt bij de print functie pas iets echt weggeschreven bij een nieuwe regel. Dit gebeurt bij Flush=false. Flush=true gebruik je eigenlijk alleen in situaties waarbij je zeker wilt zijn dat het wegeschreven is voordat je verder gaat. Normaal gesproken is dit niet nodig. Inhoudsopgave Cursus 85 Inhoudsopgave naslagwerk round(object, decimalen) Bijvoorbeeld: getal = 2,345238 afgerond = round(getal, 1) geeft 2,3 want het wordt afgerond op 1 decimaal str(object) Met deze functie kun je van een integer of real een string maken. Voorbeeld: a=3.4+2 b=str(a) print("De uitkomst is " + b) 11 Modules Modules importeren Module random Module Turtle Naast de built in functies kent Python een heleboel modules van functies die je kunt importeren. Dit doe je met de opdracht import. Voorbeelden van modules zijn: NumPy en SciPy die vol zitten met wiskundige functies Pygame voor het maken van 2d-games in Python Pyglet voor 3d animatie en games random voor willekeurige getallen turtle voor tekenen De bovenste drie zijn niet meegeleverd met pyscripter portable maar zijn wel gratis van het internet te halen. De onderste twee wel. Modules importeren Importeren van modules doe je met: import modulenaam Module random Random getallen Random getallen zijn willekeurig gegenereerde getallen. Python kent hier verschillende functies voor. De functies bevinden zich in de module “random”. Wil je een random functie kunnen gebruiken dan moet je eerst de module aanroepen. Dit doe je met “import”. Het volgende programma genereert gehele getallen van 20 tot en met 30. Typ en run het programma minimaal 5 keer. Je zult zien dat er steeds een willekeurig getal tussen 20 en 30 op het scherm komt. # Voorbeeld 2 Random getallen import random a = random.randint(20,30) Inhoudsopgave Cursus 86 Inhoudsopgave naslagwerk print(a) Merk op dat je de naam van de module voor de naam van de functie moet plakken. Module Turtle Om in Pyscripter Portable te kunnen tekenen moeten we eerst een instelling aanpassen. 6. Ga in het menu naar "Run, Python Engine" en kies dan Remote(Tk). De standaard instellling is “Remote”. De module Turtle die we gaan gebruiken heeft echter “Remote(Tk)” nodig. Alle turtle opdrachten zijn te vinden op: https://docs.python.org/3.2/ Kies daarna voor Global Module Index en dan turtle. Je kunt ook in het menu klikken op Help, Python manuals, modules, turtle. Turtle betekent schildpad. We gaan nu een vierkantje tekenen. In het programma is de schildpad een soort pijltje. 7. Typ en run: import turtle #We mogen gebruik maken van de functies uit de turtle module venster = turtle.Screen() # maakt een grafisch venster jorah = turtle.Turtle() # maakt een schildpad genaamd jorah jorah.forward(100) # Er onstaat een lijntje van 100 pixels lang jorah.left(90) # jorah draait 90 graden naar links jorah.forward(50) jorah.left(90) jorah.forward(100) jorah.left(90) jorah.forward(50) jorah.left(90) venster.exitonclick() # Sluit het venster af als je er op klikt Inhoudsopgave Cursus 87 Inhoudsopgave naslagwerk